DLLから送られてくるメッセージを受信するには? – プログラミング – Home

DLLから送られてくるメッセージを受信...
 
通知
すべてクリア

[解決済] DLLから送られてくるメッセージを受信するには?


dag
 dag
(@dag)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

現在、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構造体データの受信方法について教えてく
ださい。
よろしくお願いします。


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

__typeof?
http://msdn.microsoft.com/ja-jp/library/x2xw8750(VS.71).aspx


返信引用
dag
 dag
(@dag)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

__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をどのようにマネージ型にしたら良いかわかりませんが、調べてみます。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

確認してないので動くかどうかわかりませんが、

COPYDATASTRUCT * cds = static_cast< COPYDATASTRUCT * >( m->LParam.ToPointer() );

とかダメですか?


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

C++側はシャノンさんの提示の方法で十分だと思います。

>__typeofの引数はマネージ型である必要があるそうです。
>COPYDATASTRUCTをどのようにマネージ型にしたら良いかわかりませんが、調べてみます。
あえてマネージ型にするならCOPYDATASTRUCTを value class で定義してやればいいのですが
.NET2003なら __value class かな?


返信引用
dag
 dag
(@dag)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

遅くなりましてすみません。
シャノンさんの方法で受信することが出来ました。

データの扱いについては、フォーム側でもマネージ型にする必要がないので
この方法を採用しようと思います。

>subaruさん
.NET 2003ですと__value classのようですね。

どうもありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました