通常我們都是使用CoCreateInstance或CoGetClassObject獲得接口
通過研究我發現其實上述訪問方式本身就存在問題
具體設計
下面是一個gdi擴展函數庫gdiex
在COM內部設計導出函數
HRESULT WINAPI GdiexCreate(LPVOID *lplpGdiex)
{
HRESULT hr;
ISaveDDCtl * pCtrl = NULL;
hr = CoCreateInstance( CLSID_SaveDDCtl
if(FAILED(hr))
{
MessageBox(NULL
return hr;
}
*lplpGdiex = (LPVOID) pCtrl;
return S_OK;
}
該函數可以放在主要cpp文件中
在導出的頭文件(gdiex
HRESULT WINAPI GdiexCreate(LPVOID *lplpGdiex)
只要不重新生成COM
下來在gdiex
EXPORTS
DllCanUnloadNow PRIVATE
DllGetClassObjectPRIVATE
DllRegisterServerPRIVATE
DllUnregisterServerPRIVATE
GdiexCreate
調用的時候
ISaveDDCtl * pCtl = NULL;
CoInitialize( NULL );
hr = GdiexCreate( (LPVOID*) &pCtl );
if(FAILED( hr )) {
return hr;
}
GdiexFree( (LPVOID) &pCtl ); //gdiex釋放API
CoUninitialize();
就是這樣
From:http://tw.wingwit.com/Article/program/Delphi/201311/8447.html