原文出處:passing c++ object in atl dll
簡介幾個星期以前,我拼命的尋找乙個能夠通過com介面傳遞c++物件的例子,但是,沒有找到.這就是我發表這篇文章的原因。
向atl的dll中傳遞乙個c++物件引數並不是非常之難,但是,當然也會有點難度,也很有趣。
在開始乙個工程以前,首先你得確信客戶機和伺服器元件都是適應c++的程式,其次,你必須知道怎樣設定你的客戶機和伺服器。
介面的侷限性
com技術要求客戶機和伺服器高度的分離,這是通過介面實現的,但是問題出在:介面的方法中只提供了有限個引數資料型別,如果這個介面是基於idispatch的,引數型別的可選範圍就更加受到限制了,由於這些侷限性,c++物件只有在滿足以下條件時才能夠傳遞:
客戶機和伺服器都是由vc++編寫。
它們必須共享物件的定義(比如 標頭檔案)。
傳遞應用程式設計的簡單的物件。
你的應用程式可能需要執行在乙個分布式環境下。你希望com的遠端活動,本地/遠端活動是透明的,安全的。
我建議,在開始工作之前,先順序的看一下各個標題,現在,我列出例項,並作以下事情:
建立乙個atl dll伺服器,
新增乙個mfc類,從cobject類派生,
在類的頭部使用 declare_serial 巨集,
在類的中間使用 implement_seri 巨集,
覆蓋serialize() 方法, // 你的 c******obj 類應該像這樣:
class c******obj : public cobject
;// 把這個資料物件寫入到文件中
void c******obj::serialize(carchive& ar)
else
}// 顯示物件資料的方法
void c******obj::show()
//把字串資料儲存到乙個變數中
void c******obj::setstring(cstring csdata)
現在,下一步就是用乙個carchive物件來進行序列化和反序列化(載入和儲存物件),我用了乙個叫cblob的新類來實現的 class cblob
;virtual ~cblob() {};
// 從乙個 cobject物件中提取資料並載入到乙個 safearray物件中.
safearray* load( cobject *pobj );
// 重新建立乙個safearray物件
bool expand( cobject * &pobj, safearray *pvar );
private:
};// 從乙個 cobject物件中提取資料並用它構建乙個 safearray物件.
safearray* cblob::load( cobject *pobj)
// 重新建立乙個safearray物件
bool cblob::expand(cobject * &rpobj, safearray *psa)
建立乙個com介面,
建立乙個safearray物件,
在idl檔案中定義: [helpstring("method setarray")]
hresult setarray([in]safearray (unsigned char) pdata);[helpstring("method getarray")]
hresult getarray([out/*,retval*/]safearray(unsigned char) *pdata);
建立乙個基於mfc的客戶機來測試該應用程式 你的idl檔案應該象這樣:
inte***ce ibolbdata : iunknown
;// 設定物件
stdmethodimp cbolbdata::setarray(safearray *pdata)
// 建立物件 並傳送給客戶機.
stdmethodimp cbolbdata::getarray(safearray **pdata)
最後,寫乙個有兩個按鈕的基於對話方塊的 mfc 應用程式 並新增如下**: void cclientdlg::onok()
// 通過智慧型指標處理任意 com 異常
catch (_com_error e)
}void cclientdlg::onload()
catch (_com_error e)
}
總結
向ATL DLL中傳遞C 物件
com技術要求客戶機和伺服器高度的分離,這是通過介面實現的,但是問題出在 介面的方法中只提供了有限個引數資料型別,如果這個介面是基於 idispatch的,引數型別的可選範圍就更加受到限制了,由於這些侷限性,c 物件只有在滿足以下條件時才能夠傳遞 客戶機和伺服器都是由vc 編寫。它們必須共享物件的定...
boost python 函式中傳遞物件
class 類 class xeventwarp public xevent xeventwarp pyobject self const xevent copy xevent copy self self xeventwarp boost python module core xevent匯出函式...
傳遞物件的方式 C
接受拖放的目標控制項可以接受被拖放的控制項物件,也可以只接受字串型別的引數。接受的內容依賴於被拖放控制項傳遞的型別 以下為傳遞物件的方式 void control mousedown object sender,mouseeventargs e 以下為傳遞字串型別的方式 void control m...