一个COM问题?(100分)

  • 主题发起人 小树流
  • 开始时间

小树流

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一个类型库里定义了两个接口
ICommCtrl = interface(IUnknown)
function GetCtrlList: ICtrlList; stdcall;
function SetCtrlList(const ACtrlList: ICtrlList): HResult; stdcall;

ICtrlList = interface(IDispatch)
procedure Add(ACtrl: Integer); safecall;

TCtrlList = class(TInterfacedObject, ICtrlList)
private
FObjList: TList;
public
procedure Add; safecall;
end;

TCommCtrl = class(TTypedComObject, ICommCtrl)
private
FObjectList: ICtrlList;
protected
function GetCtrlList: ICtrlList; stdcall;
function SetCtrlList(const ACtrl: ICtrlList): HResult; stdcall;
public
destructor Destroy; override;
procedure Initialize; override;

[Error] CommSev.pas(35): Undeclared identifier: 'GetTypeInfoCount'
[Error] CommSev.pas(35): Undeclared identifier: 'GetTypeInfo'
[Error] CommSev.pas(35): Undeclared identifier: 'GetIDsOfNames'
[Error] CommSev.pas(35): Undeclared identifier: 'Invoke'

请问是哪里出了错? 怎样写才正确呢?


 
ICommCtrl 接口 继承于IDispatch,你的类要实现ICommCtrl接口就得
把IDispath接口的方法一起实现了 。
 
你应该让TCommCtrl继承于TAutoObject,它已经实现了IDispath的那四个方法.
TCommCtrl = class(TAutoObject, ICommCtrl)
 
对不起,我没写清楚,TCommCtrl定义一开始定义调试没错,.后来又加上了ICtrlList接口,
报错是在TCtrlList = class(TInterfacedObject, ICtrlList)的定义上
 
那不一样吗,TInterfacedObject同样没实现IDispath的方法,应该换成 TAutoObject
 
谢谢,可我还是有一个问题不能理解,为什么我以前不用类型库工具写,
而是用自己写的接口定义,uses过来用,就可以呢?
 
接受答案了.
 

Similar threads

I
回复
0
查看
706
import
I
I
回复
0
查看
541
import
I
I
回复
0
查看
553
import
I
I
回复
0
查看
638
import
I
I
回复
0
查看
296
import
I
顶部