调用C写的COM控件的问题 |
答題得分者是:ha0009
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
我自己用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 發送簡訊給我 |
你好:
可能你帶入錯誤的 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 發送簡訊給我 |
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
引言: 你好: 沒錯,而呼叫 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 转换其接口类型不会出错的。 那么,问题是什么呢? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |