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;implementationuses 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的赋值代码去掉,则函数是可以正常运行的来个大牛帮帮忙吧!
我最终要实现的目的是用Exe调用DLL中导出的COM接口COM DLL一个COM Object
type
TCOM1 = class(TTypedComObject, ICOM1)
protected
function Show(v1, v2: Integer): Integer; stdcall;
end;implementationuses 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的赋值代码去掉,则函数是可以正常运行的来个大牛帮帮忙吧!
改成
function Show(v1, v2: Integer; out lResult : Integer): HResult; stdcall;
返回值给S_OKQT不太清楚,我怀疑dynamicCall是靠判断HResult的返回值作为调用成功的检查的.
我发的那么些帖子没作用?
用调试工具啊
很多的od windbg IDA.没有 堆栈 寄存器数据 没有参数调用观察 很难知道是什么原因
看你代码 感觉是调用方式的问题
你追踪下 它的调用方式看看