Qt调用Delphi编写的COM组件
来源:互联网 发布:艾漫数据 编辑:程序博客网 时间:2024/05/06 17:46
这个问题捣鼓了两天,现在终于解决了,做个笔记分享给大家,以免走弯路
起初,我的想法是在DLL中写一个interface并从函数中导出这个interface,像这样的代码
ICom1 = interface function Show(V1, V2: Integer): Integer stdcall;end;
最后均以失败告终,后来想到各种编译器对编译后的二进制组织方式是不同的
比如上面的代码如果用Delphi编写的Exe去调用就是没问题的,而用其他语言则可能会有问题
网上有很多跨语言调用方案是用虚类来解决,也许有些时候是可以正常调用,但是这种做法并不规范,容易出问题
这里就需要通过一个标准,一个与语言无关的标准,也就是微软的COM组件了
所以得改下这个DLL
新建一个Automation Object
注意,这里一定要用Automation Object,而不要用COM Object,因为后者不支持自动化调用
而QAxObject只支持自动化对象,如果你尝试去调用一个不支持自动化的COM Object会得到一条消息
“QAxBase::dynamicCallHelper: Object does not support automation”
创建成功后接口是这样的
ICOM2 = interface(IDispatch) ['{53952FF2-94A4-4B14-9C38-E4E56C87940A}'] function Show(v1: Integer; v2: Integer): Integer; stdcall;end;
注意,我们在Exe中查询需要用到的GUID是类ID而不是这里的接口ID,在Delphi自动生成的 XXX_TLB.pas 文件中是有这个GUID的
我这里的是 {0EA6D9F4-0587-4AB9-91AD-9CD657B0787D}
最后实现
function TCOM2.Show(v1, v2: Integer): Integer;begin OutputDebugString(PChar(Format('TCom2(%d, %d)', [v1, v2]))); Result := 2;end;
现在到Qt中,首先写一个函数,功能是从一个COM DLL中动态创建接口实例
这样用的好处是COM DLL不用注册就能用,当然注册的话调用起来会更方便
LPUNKNOWN CreateComObjectFromDll(const QString &dll, REFCLSID clsid){ QLibrary lib(dll); if (lib.load()) { typedef HRESULT (__stdcall *DllGetClassObject)(REFCLSID, REFIID, LPVOID*); DllGetClassObject getClassObject = (DllGetClassObject)lib.resolve("DllGetClassObject"); if (getClassObject != nullptr) { IClassFactory *factory; if (getClassObject(clsid, IID_IClassFactory, (LPVOID*)&factory) == S_OK) { LPUNKNOWN ret = nullptr; factory->CreateInstance(nullptr, IID_IUnknown, (void**)&ret); return ret; } } } return nullptr;}
最后,调用部分
LPUNKNOWN obj = CreateComObjectFromDll("com", cid);QAxObject o(obj);o.dynamicCall("Show(int, int)", 123, 456);
参数cid就是接口类GUID
可以看到输出窗口正常显示了结果。
总结:起初没有使用标准的COM接口,走了不少弯路。。。 -_-!
- Qt调用Delphi编写的COM组件
- DELPHI中COM组件编写及调用
- VS2005调用Delphi编写的COM程序
- QT调用COM组件
- 使用Delphi编写COM组件
- DELPHI怎样编写COM组件
- PHP4调用自己编写的COM组件
- PHP4调用自己编写的COM组件
- PHP4调用自己编写的COM组件
- PHP4调用自己编写的COM组件
- VBS调用ATL编写的COM组件
- win32com调用ATL编写的COM组件
- C++调用C#编写的COM组件
- JavaScript调用C#编写的COM组件
- delphi 编写的com 对象 用delphi 的调用实例
- 怎样用DELPHI调用COM组件
- Delphi 编写COM+组件的知识和样例
- Delphi 编写COM+组件的知识和样例
- 用mvc模式开发的简单网页计算器
- 函数默认实参
- 多个接口的继承
- Ubuntu下配置samba
- php 做api开发 关键key 的加密问题
- Qt调用Delphi编写的COM组件
- 使用Maven发布项目
- Delicious Founder Creates New People Search Engine, Skills.to
- C语言版随机分配座位问题
- 08-把整型数据格式化为指定长度的字符串(字符串处理)
- OracleParameterCollection 只接受非空的 OracleParameter 类型对象
- SSL与TLS
- File基本知识
- Android学习笔记--解析XML之SAX