我玩过使用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对我来说有点混乱,我只是在这里猜测)
答案 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
单位)