如何实现IDispatch方法?

时间:2012-06-09 21:45:01

标签: delphi com delphi-xe2

我玩过使用COM界面访问的第三方库 对于某些测试,我创建了主窗体:

TForm1 = class (TForm, IThirdParyCOMInterface)

TForm1实现了IThirdParyCOMInterface的所有方法,我得到了我需要的功能。

下一步是创建一个单独的类,仅用于处理此COM接口 做这样的事情:

TMyClass = class (TInterfacedObject, IThirdParyCOMInterface)

导致编译器错误:

  

E2291缺少接口方法IDispatch.GetTypeInfoCount的实现   E2291缺少接口方法IDispatch.GetTypeInfo的实现
  E2291缺少接口方法IDispatch.GetIDsOfNames的实现   E2291缺少接口方法IDispatch.Invoke

的实现

(IThirdPartyCOMInterface = interface(IDispatch))
似乎TForm已经实现了这些IDispatch方法,但是我的新简单类没有。

如何为上述新课程做到这一点? 我应该从哪个类继承我的新类,以便已经实现了这些IDispatch方法?

编辑:
我刚发现了TAutoIntfObject。这就是我需要的吗? (COM对我来说有点混乱,我只是在这里猜测)

2 个答案:

答案 0 :(得分:5)

COM中的传统操作,特别是如果您正在编写一个充当自动化服务器(也称为DCOM服务器)的EXE进程,则将COM接口与表单分开。

即使你正在编写普通的Delphi应用程序而不想变成一个巨大的泥球,这也是传统的做法。因此,问问自己为什么要使FORM实现您的调度接口。即使在一个快速而肮脏的演示中,将COM服务器类和表单混淆在一起也很有趣,你不需要这样做。

双接口(自动化)对象通常构建为自己的类,可以私下对表单进行引用。我建议你检查一下这样做。

IThirdPartyComInterface应由您自己的类TThirdPartyComInterface实现,并且应该是双COM(Native vtable + Dispatch)对象。

然后您应该注册您的COM服务器对象,您将开始营业。

有各种教程,但似乎没有最新的。这是Delphi 7.

的一个

也许最好的去处是DocWiki,它将显示Com对象向导,您应该使用它来创建实现IDispatch的TThirdPartyComInterface类,以及本机VTable COM(更高性能)立刻。你可以将IDispatch攻入你的TForm,但每次你这样做时,我选择的一个神仙或执政官会执行我选择的小毛茸茸的动物。不要这样做。想想你正在杀死的那些小毛茸茸的动物。

答案 1 :(得分:1)

尝试使用TAutoObject代替TInterfacedObject。前者实现IDispatch,后者只实现IUnknown。 (它在ComObj单位)