2011-12-07 32 views
0

我們有一個用C++編寫的實現了網絡協議的進程外COM應用程序。當收到一個數據包時,回調被調用到註冊該數據包的應用程序中。如何在C++/CLI中使用COM進行回調

回調接口被定義爲這樣:

[helpstring("method MessageHandler")] HRESULT MessageHandler([in,size_is(nSize)] char * szBuf, int nSize, DWORD dwTransCode, DWORD dwSenderID, BSTR bstrFromIP); 

在C++中使用這種尚未一個問題。我們現在有一個案例,我們有一個需要接收回調的C++/CLI應用程序。劈砍而去後,直到編譯器是幸福的,我到下面的實現:

ref class MessageHandlerClass : public MessageRouterCallback 
    { 
    public: 
     virtual void MessageHandler(signed char %buffer, int size, unsigned int msgId, unsigned int fromId, System::String^ fromIp) 
     { 
      switch (msgId) 
      { 
      case MaintenanceMsgs::maintenance_event_message::ID: 
       { 
        SomeStructure msg; 
        myHandler->HandleMaintenanceEvent(&msg); 
       } 
      } 
     } 

這是我第一次涉足C++/CLI。

第一個問題:'%'在'signed char%buffer'中意味着什麼?

第二個問題:我可以放置一個斷點,看看回調是否被調用。我可以看看內存調試器中的'buffer'參數,它包含我期望的數據。我一直非常不成功地將這些數據提取出來並放入變量'msg'中。我知道我不能像C++那樣進行類型轉換,但是我嘗試過的每個例子(主要是InteropServices :: Marshal和一些pin_ptr的東西)似乎都無法讓我獲得任何幫助。

SomeStructure在頭文件中聲明並且包含在C++和C++/CLI應用程序中。 SomeStructure包含2個無符號短褲,後面跟着三個字符數組。

任何方向從哪裏去這裏將不勝感激。

回答

0

好的。它只是'點擊'...所以我會在這裏回答我自己的問題。

第一個問題:'%'在'signed char%buffer'中意味着什麼?

的「%」只是表示「跟蹤」,將是垃圾回收,或者至少這是我想它的意思:)

第二個問題:如何元帥。

首先,我必須進入「內部指針」,並且C++/CLI爲此提供了&運算符。然後,我可以簡單地將數據記憶在上面。

pin_ptr<signed char> p = &buffer; 

MaintenanceMsgs::maintenance_event_message msg; 
memcpy((void*)&msg, (void*)p, sizeof(msg)); 

myHandler->HandleMaintenanceEvent(&msg); 

這是安全嗎?