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つの文字配列が続きます。
ここからどこへ行くかについてのいかなる方向性も高く評価されます。