全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1009
推到 Plurk!
推到 Facebook!

调用C写的COM控件的问题

答題得分者是:ha0009
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-08 22:44:36 IP:219.133.xxx.xxx 未訂閱
我自己用DELPHI来写一个COM对象,编译为一个DLL,用REGSVR32.exe来注册到系统里,然后再用DELPHI来Import type Library,将它导入为 myText_Tlb.pas, 然后,用 CreateCOMObject 就可以调用到这个COM对象的 Interface。没任何问题。 然后,我手上有个别人用C写的COM对象,有DLL和TLB文件。我用Regsvr32.exe来把它注册到系统里,然后用DELPHI的Import type Library将它导入,然后用CreateCOMObject,却出现错误提示: Interface not support. 以前用DELPHI做COM或者COM 的时候,碰到这个问题,一般是在调用的客户机上没有注册,或者没有调用的权限。但现在,我是在同一台机器上注册并用DELPHI来调用它的。不存在没有注册或者没有权限的问题。 那么,还有什么原因会导致这个错误呢?
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-08 23:06:54 IP:61.56.xxx.xxx 未訂閱
你好: 可能你帶入錯誤的 ClassID 吧,Import TypeLib 時 Delphi 會產生對應的  CoClass 物件,它提供你安全呼叫 Com 的 Class function。我建議你使用這個 方式呼叫 Com 物件。範例如下    
// COM 宣告
  CoCommand = class
    class function Create: _Command;
    class function CreateRemote(const MachineName: string): _Command;
  end;          _Command = interface(Command25)
    ['{B08400BD-F9D1-4D02-B856-71D5DBA123E9}']
    procedure _Set_CommandStream(const pvStream: IUnknown); safecall;
    function Get_CommandStream: OleVariant; safecall;
    procedure Set_Dialect(const pbstrDialect: WideString); safecall;
    function Get_Dialect: WideString; safecall;
    procedure Set_NamedParameters(pfNamedParameters: WordBool); safecall;
    function Get_NamedParameters: WordBool; safecall;
    property Dialect: WideString read Get_Dialect write Set_Dialect;
    property NamedParameters: WordBool read Get_NamedParameters write Set_NamedParameters;
  end;    // 如何運用
var
   cmd : _Command;
begin
   cmd := CoCommand.Create;
   try
      ....
      ....
      ....
   finally
      cmd := Nil;
   end;
end;
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-08 23:16:36 IP:219.133.xxx.xxx 未訂閱
你好! 谢谢您的关注。 在DLEPHI Import type library 进来的pas里,那个CoMyTestCOM物件的Create也是调用CreateCOMObject来做的。 我的测试里,如果是针对我自己用DELPHI写的COM对象用 CoMyTestCOM.Create来调用,没有问题。 但用这个方法来调用我一个朋友用C 来写的COM对象,仍然出 Interface not support的错误提示。
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-08 23:22:31 IP:61.56.xxx.xxx 未訂閱
你好: 沒錯,而呼叫 CoClass 只是確保不會發生弄錯 ClassID 。 Interface not support 這種情況通常是指存取的介面不存在, 你是否可以提供 DLL 檔讓我們也幫忙試試呢 < src="http://sourceprovide.deepen.com.tw/K_Top/bp.gif">
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-08 23:25:56 IP:219.133.xxx.xxx 未訂閱
多谢!! 那个DLL档如何给您?请问这里可以上传档案吗?
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-09 09:12:19 IP:219.133.xxx.xxx 未訂閱
引言: 你好: 沒錯,而呼叫 CoClass 只是確保不會發生弄錯 ClassID 。 Interface not support 這種情況通常是指存取的介面不存在, 你是否可以提供 DLL 檔讓我們也幫忙試試呢 < src="http://sourceprovide.deepen.com.tw/K_Top/bp.gif">
昨天在调用一个用C 写的COM对象的时候,碰到Interface not support,一直找不到原因。 今天发现,如果按照这样写: MyIntf:=CreateRemoteCOMObject('',CLASS_MyTestCOM) as IUnKnown; 就没有问题。 如果再做一次接口转换: AInft:=MyIntf as IMyTestCOM; 的时候,出现此提示。 因为我昨天一直是这样写的: MyIntf:=CreateRemoteCOMObject('',CLASS_MyTestCOM) as IMyTestCOM; 所以就一直出现这个问题。 如果是 CoMyTestCOM.Create,其实它也是用了 as 做接口转换的。因此也出现这个错误。 因此,问题在接口的类型转换上。但是,DELPHI Import tyep library进来的 XXX_TLB.pas里,的确对那个接口的定义是: IMyTestCOM=interface(IUnknown) 如果我自己用DELPHI写的COM,然后再Import type library,这里也是如此定义的,直接用 as 转换其接口类型不会出错的。 那么,问题是什么呢?
系統時間:2024-04-28 14:43:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!