熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

加載COM的方式

2013-11-11 21:04:58  來源: Delphi編程 

  通常我們都是使用CoCreateInstance或CoGetClassObject獲得接口再通過接口訪問他的成員方法在C++支持下從來不會有任何問題但是如果使用Win模式純粹C風格編程就會出現問題了

  通過研究我發現其實上述訪問方式本身就存在問題標准的訪問方式如DD一樣接口的初始化必須在Com提供的API基礎上完成COM設計者需要提供一個API像DLL的導出函數一樣供給外部程序調用

  具體設計

  下面是一個gdi擴展函數庫gdiexGdiexCreate就是創建接口的一個函數如同DirectDCreate一樣調用這個函數可以立刻創建一個接口指針

  在COM內部設計導出函數

  HRESULT WINAPI GdiexCreate(LPVOID *lplpGdiex)
{
HRESULT hr;
ISaveDDCtl * pCtrl = NULL;
  
hr = CoCreateInstance( CLSID_SaveDDCtl NULL CLSCTX_SERVER IID_ISaveDDCtl (void**) &pCtrl);
  
if(FAILED(hr))
{
 MessageBox(NULL GdiexCreate Failed! gdiexPS MB_OK|MB_ICONSTOP);
 return hr;
}
  
*lplpGdiex = (LPVOID) pCtrl;
  
return S_OK;
}

    該函數可以放在主要cpp文件中

  在導出的頭文件(gdiexh)中作出聲明

  HRESULT WINAPI GdiexCreate(LPVOID *lplpGdiex)

  只要不重新生成COM這個頭文件中都會包含該API

  下來在gdiexdef增加這個API名字以便外部訪問

  EXPORTS
DllCanUnloadNow PRIVATE
DllGetClassObjectPRIVATE
DllRegisterServerPRIVATE
DllUnregisterServerPRIVATE
  GdiexCreate

    調用的時候只需要在工程中包含gdiexh 輸入gdiexlib就可以調用到這個API

  ISaveDDCtl * pCtl = NULL;
CoInitialize( NULL );
  
hr = GdiexCreate( (LPVOID*) &pCtl );
if(FAILED( hr )) {
return hr;
}

GdiexFree( (LPVOID) &pCtl );  //gdiex釋放API在gdiex模塊中定義
CoUninitialize();

    就是這樣調用者沒有出現多余的訪問就可以獲得接口而且C/C++都可以很好的工作


From:http://tw.wingwit.com/Article/program/Delphi/201311/8447.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.