2011-12-07 8 views
0

C++で記述されたプロセス外のCOMアプリケーションがあり、これはネットワークプロトコルを実装しています。データパケットが受信されると、パケットに登録されたアプリケーションにコールバックが呼び出されます。C++/CLIでCOMコールバックをMarcshalする方法

コールバックインターフェースは、例えば次のように定義される。

[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」の意味ですか?

2番目の質問:ブレークポイントを配置し、コールバックが呼び出されていることを確認できます。私はメモリデバッガの 'バッファ'引数を見ることができ、それは私が期待するデータを含んでいます。私はそのデータを取り出して変数 'msg'に入れるのは非常に失敗しています。私はC++のようなキャストを行うことはできませんが、私が試したすべての例(ほとんどInteropServices :: Marshalとpin_ptrのもの)はどこにでもいられないようです。

SomeStructureはヘッダーファイルで宣言され、C++アプリケーションとC++/CLIアプリケーションの両方に含まれています。 SomeStructureには2つの符号なしshortと3つの文字配列が続きます。

ここからどこへ行くかについてのいかなる方向性も高く評価されます。

答えて

0

それはちょうど「クリックされた」...だから私はここで私自身の質問に答えます。

最初の質問:「%」は「signed char%buffer」の意味ですか?

「%」はちょうどその「追跡」を意味し、ごみ収集になり、あるいは少なくともそれは私がそれが意味:)考えるものだ

2番目の質問:マーシャリングする方法。

最初に私は '内部ポインタ'に行き、C++/CLIはそのために&演算子を提供していました。それから私は単純にデータをmemcpyすることができました。

pin_ptr<signed char> p = &buffer; 

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

myHandler->HandleMaintenanceEvent(&msg); 

これは安全ですか?

関連する問題