Windows中COM组件是Windows中重要组成部分,可以注册成系统公共组件,也可以不注册直接调用。在D语言中调用COM组件前,我们需要了解COM组件。COM组件都有一个公共的接口,使用IDL语言编写,使用mild.exe编译器编译后生成tlb格式文件,通常叫做类型库,在生成COM组件的DLL时,会把这个文件放在DLL的资源文件中,资源名称叫做TYPELIB
要调用COM组件,先需要知道COM组件的接口,因此可以先从dll中把类型库导出成IDL接口文件,再把IDL接口文件转化为D语言的接口文件,这样就可以在D语言中使用COM控件了。
一、提取COM文件中的接口为IDL文件
把mscomm32.ocx文件拖放到VS中查看,如上图所示,可以看到TYPELIB资源,右键-->导出 文件,命名为mscomm32.tlb,文件是接口文件的编译格式,需要使用OLE/COM Object Viewer转为IDL文件。我们这儿使用d语言的一个工具tlb2idl.exe来转换,这个工具是visuald中的一个工具。转换时第三个参数需要指定IViewers.dll的路径,实际上也是使用OLE/COM Object Viewer来进行转换。
转换成功后,成重i.dll文件,如图:
由于tlb2idl.exe程序是使用LoadTypeLib函数来加载类型库,所以需要先把类型库从DLL中导出来,如果使用LoadTypeLibFromResource函数直接从exe/dll中读取类型库,则可以直接从exe/dll中导出idl文件。使用LoadRegTypeLib函数则可以直接导出已经注册的COM控件接口。
二、把idl文件转换为D语言接口
转换idl为D语言可以使用visualD的vsi2d.exe工具完成。
这样就生成了i.d的文件,即为mscomm32.ocx的接口文件。
三、调用COM控件
有了COM控件的接口,使用COM控件已经完成了一大半,现在只是需要来使用COM控件就可以了。调用COM控件需要以下几步:
1)使用LoadLibrary加载dll文件
2)使用GetProcAddress得到DllGetClassObject函数指针
3)通过调用DllGetClassObject函数指针获得IClassFactory工厂。
4)调用IClassFactory工厂的CreateInstance函数创建实例。
5) 把实例的指针转化为接口,之后就可以使用了。
参考:http://blog.csdn.net/wangqiulin123456/article/details/8962453
参考C++:http://blog.csdn.net/haijun286972766/article/details/6273414
参考C++:http://www.cnblogs.com/cpper-kaixuan/p/3540446.html?utm_source=tuicool&utm_medium=referral