現在、Visual Studio .NET2003を使ってフォームアプリケーションを作成しています。
(フォームアプリケーションはManaged C++)です。
DLLから「SendMessage」で送られてくるメッセージと、メッセージのLParamに入っている
データの内容(COPYDATASTRUCT構造体)を受け取りたいのですが、受け取り方がわかりません。
C#では、
COPYDATASTRUCT cds = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam,
typeof(COPYDATASTRUCT));
という受け取り方をしていますが、それをC++に書き直した場合の2番目の引数がわかりま
せん。
COPYDATASTRUCT* cds =
(COPYDATASTRUCT)System::Runtime::InteropServices::Marshal::PtrToStructure(m->LParam,
typeof(COPYDATASTRUCT));
typeof(COPYDATASTRUCT)に対応するような、構造体のTypeを返すメソッド等がわかりません。
SendMessageから送られてくるCOPYDATASTRUCT構造体データの受信方法について教えてく
ださい。
よろしくお願いします。
__typeofを教えていただき有難うございます。
早速、
COPYDATASTRUCT* cds;
cds = System::Runtime::InteropServices::Marshal::PtrToStructure(m->LParam,
__typeof(COPYDATASTRUCT));
と記述してみましたが、「error C3181: 'COPYDATASTRUCT' : __typeof のオペランドが
無効です。完全に定義されたマネージ型が必要です。」というコンパイルエラーが表示さ
れました。
http://msdn.microsoft.com/ja-jp/library/fht45e4b.aspx
__typeofの引数はマネージ型である必要があるそうです。
COPYDATASTRUCTをどのようにマネージ型にしたら良いかわかりませんが、調べてみます。
確認してないので動くかどうかわかりませんが、
COPYDATASTRUCT * cds = static_cast< COPYDATASTRUCT * >( m->LParam.ToPointer() );
とかダメですか?
C++側はシャノンさんの提示の方法で十分だと思います。
>__typeofの引数はマネージ型である必要があるそうです。
>COPYDATASTRUCTをどのようにマネージ型にしたら良いかわかりませんが、調べてみます。
あえてマネージ型にするならCOPYDATASTRUCTを value class で定義してやればいいのですが
.NET2003なら __value class かな?
遅くなりましてすみません。
シャノンさんの方法で受信することが出来ました。
データの扱いについては、フォーム側でもマネージ型にする必要がないので
この方法を採用しようと思います。
>subaruさん
.NET 2003ですと__value classのようですね。
どうもありがとうございました。