Qt调用Delphi编写的COM组件

新建一个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

   

猜你喜欢

转载自blog.csdn.net/lengyuezuixue/article/details/80619543
今日推荐