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的赋值代码去掉,则函数是可以正常运行的来个大牛帮帮忙吧!

解决方案 »

  1.   

    function Show(v1, v2: Integer): Integer; stdcall;
    改成
    function Show(v1, v2: Integer; out lResult : Integer): HResult; stdcall;
    返回值给S_OKQT不太清楚,我怀疑dynamicCall是靠判断HResult的返回值作为调用成功的检查的.
      

  2.   

    还在 求助啊。。
    我发的那么些帖子没作用?
    用调试工具啊
    很多的od windbg IDA.没有 堆栈 寄存器数据 没有参数调用观察 很难知道是什么原因
    看你代码 感觉是调用方式的问题
    你追踪下 它的调用方式看看
      

  3.   

    问题已解决,分享一下吧,哪天有朋友遇到同样的问题可以少走弯路http://blog.csdn.net/aqtata/article/details/9163689
      

  4.   

    前段时间我也遇到com问题.主要是COM组件使用之前需要初始化一次./