高分求助!跨语言调用COM异常

一如当初 2013-06-24 12:42:43
COM组件是用Delphi开发的,EXE用Qt开发
我最终要实现的目的是用Exe调用DLL中导出的COM接口

COM DLL

一个COM Object


type
TCOM1 = class(TTypedComObject, ICOM1)
protected
function Show(v1, v2: Integer): Integer; stdcall;
end;

implementation

uses ComServ;

function TCOM1.Show(v1, v2: Integer): Integer;
begin
// 将传递进来的参数输出到调试器
OutputDebugString(PChar(Format('TCom1(%d, %d)', [v1, v2])));
Result := 1;
end;


然后提供一个导出函数,来导出COM Object的实例


function GetCom1: ICOM1 stdcall;
begin
Result := CoCOM1.Create;
end;


以上就是这个COM DLL核心的部分
为了测试,我用Delphi创建了一个EXE调用测试都正常,没问题


ICOM1 = interface(IUnknown)
function Show(v1: Integer; v2: Integer): Integer; stdcall;
end;

var
O: ICOM1;
begin
O := GetCom1; // 从DLL导出函数中获得COM实例
O.Show(11, 22); // 调用COM接口方法,成功输出数字
end;


接着问题来了,我要用Qt开发的Exe来调用


QLibrary lib("com");
if (lib.load()) {
typedef IUnknown*(__stdcall *GETCOM1)();
GETCOM1 getCom1 = (GETCOM1)lib.resolve("GetCom1");
IUnknown *com1 = getCom1(); // 这一步就发生异常了,异常发生在GetCom1导出函数中的 Result := CoCOM1.Create;
QAxObject obj(com1);
obj.dynamicCall("Show(int v1, int v2)", 55, 66);
}




异常发生在DLL导出函数"GetCom1"中,创建COM Object那一句


function GetCom1: ICOM1 stdcall;
begin
OutputDebugString('111111'); // 代码只走到这里
Result := CoCOM1.Create; // 对Result进行赋值,崩溃了
OutputDebugString('222222');
end;


如果把对Result的赋值代码去掉,则函数是可以正常运行的。。。

来个大牛帮帮忙吧!
...全文
411 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Y.A.K.E 2013-06-25
  • 打赏
  • 举报
回复
前段时间我也遇到com问题. 主要是COM组件使用之前需要初始化一次./
sololie 2013-06-24
  • 打赏
  • 举报
回复
一如当初 2013-06-24
  • 打赏
  • 举报
回复
问题已解决,分享一下吧,哪天有朋友遇到同样的问题可以少走弯路 http://blog.csdn.net/aqtata/article/details/9163689
一如当初 2013-06-24
  • 打赏
  • 举报
回复
引用 1 楼 wr960204 的回复:
function Show(v1, v2: Integer): Integer; stdcall; 改成 function Show(v1, v2: Integer; out lResult : Integer): HResult; stdcall; 返回值给S_OK QT不太清楚,我怀疑dynamicCall是靠判断HResult的返回值作为调用成功的检查的.
代码还没走到调用那里……但是猜测和你一样,可能内存管理上的问题
bbc9527 2013-06-24
  • 打赏
  • 举报
回复
还在 求助啊。。 我发的那么些帖子没作用? 用调试工具啊 很多的od windbg IDA.没有 堆栈 寄存器数据 没有参数调用观察 很难知道是什么原因 看你代码 感觉是调用方式的问题 你追踪下 它的调用方式看看
武稀松 2013-06-24
  • 打赏
  • 举报
回复
function Show(v1, v2: Integer): Integer; stdcall; 改成 function Show(v1, v2: Integer; out lResult : Integer): HResult; stdcall; 返回值给S_OK QT不太清楚,我怀疑dynamicCall是靠判断HResult的返回值作为调用成功的检查的.

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧