ATL中傳遞C 物件

2021-04-06 20:44:00 字數 2472 閱讀 3755

原文出處: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...