Qt调用Delphi编写的COM组件
这个问题捣鼓了两天,现在终于解决了,做个笔记分享给大家,以免走弯路
起初,我的想法是在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接口,走了不少弯路。。。 -_-!
http://blog.csdn.net/aqtata/article/details/9163689
Qt调用Delphi编写的COM组件的更多相关文章
- 分享一次C#调用Delphi编写Dll程序
1.前言: 最近接手了一个项目需要和Delphi语言编写的一个系统进行一些接口的对接,数据在传输过程中采用Des加密方式,因为Delphi 平台的加密方式和C#平台的加密方式不互通,所以采用的方式是C ...
- nodejs调用delphi编写的dll
公司的业务需要,nodejs要读取文件版本号. 同事要求我用delphi编写dll,以供nodejs调用,结果通过json返回. delphi代码如下: function GetFileInfo(AP ...
- QT 调用VS2015编写的Dll
最近在用QT调用VC生成的库,QT使用的是MinGW调试器,出现与动态库不兼容的问题,最后发现QT只能识别VC生成的C格式下的动态库 也就是在导入导出设置时加入extern "C" ...
- C# 调用delphi编写的dll
技术实现 如何逐步实现动态库的加载,类型的匹配,动态链接库函数导出的定义,参考下面宏定义即可: #define LIBEXPORT_API extern "C" __declspe ...
- JS调用Delphi编写的OCX控件
原文:http://www.mamicode.com/info-detail-471283.html 一.使用Delphi XE2编写OCX控件 生成OCX工程: 1.File-New-Other,在 ...
- JavaScript学习笔记之JavaScript调用C#编写的COM组件
1.新建一个C#类库项目:MyCom: 2.修改 Properties 目录下的 AssemblyInfo.cs(程序集文件) 中的 ComVisible 属性为 true: 3.项目->属性- ...
- [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PWideChar
Delphi代码 unit UnitDll; interface uses StrUtils, SysUtils, Dialogs; function DoBusinessWide(pvData: P ...
- [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PAnsiChar
Delphi代码 unit UnitDll; interface uses StrUtils, SysUtils, Dialogs; function DoBusinessAnsi(pvData: P ...
- [JNA系列]Java调用Delphi编写的Dll之JNA使用
介绍 给大家介绍一个最新的访问本机代码的 Java 框架 —JNA . JNA(Java Native Access) 框架是一个开源的 Java 框架,是 SUN 公司主导开发的,建立在经典的 JN ...
随机推荐
- 嵌入式MCU开发群资源
STM32CubeMX是一款图形化软件设置工具,允许使用图形化向导来生成C初始化代码.它是未来开发stm32系列产品的主流软件,是ST公司的主动原创,可以减轻开发工作,时间和费用.STM32Cube ...
- BZOJ 1014: [JSOI2008]火星人prefix( splay + hash )
用splay维护序列, 二分+hash来判断LCQ.. #include<bits/stdc++.h> using namespace std; typedef unsigned long ...
- [置顶] JNI之java传递数据给c语言
1.首先创建 DataProvider类: package com.pl.ndkpassdata; public class DataProvider { static{ System.loadLib ...
- C#利用lambda实现委托事件的挂接
转自:http://www.cdtarena.com/cpx/201307/9287.html在写一个小程序的时候,碰到了这样的问题,需要用委托来挂接事件,但是又想在这事件中使用局部的变量,而委托一旦 ...
- android 配置环境变量
在创建AVD时,在DOS下输入android list targets 会出现android不是内部或外部命令,如图-1.这主要是没有配置好android sdk环境变量所致的. 图-1 andr ...
- 转:git windows中文 乱码问题解决汇总
it的Windows版本Msysgit对中文的支持不够好 .当使用时,会出现以下三种情况的中文乱码: 下面的几个文件都在git安装目录下文件夹etc内.1.ls不能显示中文目录 解决办法:在git/g ...
- C++里面的取整函数
#include<math.h> double ceil(double x) //向上取整 double floor(double x) //向下取整 也能够用数据类型强制转换,那要看数据 ...
- 安装DBMS_SHARED_POOL包
在安装10g gc的时候,会遇到The DBMS_SHARED_POOL package is not executed on the Existing Database这样的一个错误,意思是提示你D ...
- 主题:Java WebService 简单实例
链接地址:主题:Java WebService 简单实例 http://www.iteye.com/topic/1135747 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要 ...
- 分享最新15个加速 Web 开发的框架和工具(梦想天空)
我们为开发人员挑选了15个最新的 Web 开发框架,你肯定尝试一下这些新鲜的框架,有的可能略微复杂,有的提供了很多的配置选项,也有一些窗口小部件和界面交互的选择.他们将帮助你创建更优秀的网站,提供给 ...