2016-10-30 14 views
-1

同じラップトップの2つのアプリ間で通信するには、sendMessagereplyMessageを使用します。受信側では、送信者からのメッセージを受信すると、メッセージで応答します。したがって、送信者プロセスでは、MyStructをLRESULTにキャストし、これを送信者アプリに返信します。私は受信側でそれをキャストしようとしました、それも動作します。私は、送信者側でMyStructにこのLRESULTをキャストしようとしていたときLRESULTをカスタム構造型にキャストする方法は?

PCOPYDATASTRUCT result; 
MyStruct* data; 
LRESULT a; 
MyStruct* t; 
MyStruct* reply = new MyStruct; 
switch (uMessageType) 
{ 
case WM_COPYDATA: 
    result = (PCOPYDATASTRUCT)addtionalData; 
    data = (MyStruct*)result->lpData; 

    reply->msgId = 10; 
    strcpy_s(reply->msgInfo, 100, "test reply"); 
    a = reinterpret_cast<LRESULT>(reply); 
    t = reinterpret_cast<MyStruct*>(a);//when cast the LRESULT data to MyStruct back here, it succeed 

    ReplyMessage(reinterpret_cast<LRESULT>(reply)); 


    break; 

はしかし、それは失敗します。

LRESULT result = SendMessage(test, WM_COPYDATA, (WPARAM)(HWND)hwndC, (LPARAM)(LPVOID)&data); 
MyStruct* reply = (MyStruct*)result;//the value of reply is unreadable 

私は、送信者側で私のカスタム構造体にLRESULTを変換することができますか?

ちょうど途中でインターガーやフロートを送信しようとしました。できます。ただし、カスタム構造体MyStructを使用しても機能しません。私はそれがLRESULTのサイズがMyStructより短いためだと思います。この問題を解決するには? LRESULTの大きさは、int型のサイズは

typedef struct msg{ 
int msgId; 
char msgInfo[100]; 
}MyStruct; 
+1

SendMessage()は、WM_COPYDATAを使用するとTRUEまたはFALSEを返します。ポインターのように戻り値を扱うことができると思うのはなぜでしょうか。 –

+0

https://msdn.microsoft.com/en-us/library/windows/desktop/ms644950(v=vs.85).aspxこのリンクをチェックすると、戻り値はLRESULTであることが示されます – firstaccount

+0

@molbdniloアプリ間でアドレスを渡すしかし、私は新しいコピーコンストラクタを使用していませんが、まだそれをうまくキャストできません。私は両方を試してみましたが、私はこの質問に1つだけ投稿します – firstaccount

答えて

0

あなたがWM_COPYDATAを送る4は、データ自体は受信プロセスにコピーされても、4です。
WM_COPYDATAの受信者は、このコピーへのポインタを取得します。
両端のアドレスが同じである可能性はほとんどありませんが、各端にはデータの独自のコピーへの有効なポインタがあります。

一方、ReplyMessageはそのようなコピーを行わず、送信者のデータの(再解釈された)アドレスのみを返します。
これは受信側の有効なアドレスではありません。

データを前後に渡したい場合は、SendMessageWM_COPYDATAを両方向で使用する必要があります。独自のプロトコルを追加することも可能です。

関連する問題