2012-03-23 18 views
2

あるアプリケーションから別のアプリケーションにwin APIのデータを転送する必要があります。 は私が持っている1つのアプリでは:別であるWindowsアプリケーションから別のWindowsアプリケーションにデータをコピーするにはどうすればよいですか?

msg_number=RegisterWindowMessage(MY_WINDOW_MSG); 
cp_struct.lpData = &fig; 
cp_struct.dwData = sizeof(Figure); 
cp_struct.cbData = 6666; 
SendMessage(HWND_BROADCAST, msg_number, 0, (LPARAM)&cp_struct); 

case WM_CREATE: 
{ 
    msg_number=RegisterWindowMessage(TEXT(MY_WINDOW_MSG)); 
} 
if(msg_number != 0 && msg == msg_number) 
{ 
    reciver_struct = (PCOPYDATASTRUCT)(lParam); 
    printf("get it %d\n", reciver_struct->cbData); 
    return 0; 
} 

しかし、この受信機アプリケーションでは、私はアプリは私の構造体からの値でメッセージを得なくことがわかります。

+2

問題は、異なるプロセスがお互いのメモリを参照できないことです。プロセスの境界を越えてメモリをマーシャリングする必要があります。あなたのメッセージはそれをしません。 WM_COPYDATAは行います。 –

答えて

2

正しい、あなたは別のアプリケーションの保護されたメモリ空間から読み込むことができません。渡すポインタや参照は、受信側アプリケーションのコンテキストからは無効で無駄になります。

あなたはこの仕事をするためにReadProcessMemoryのようなものを使用することができますが、それはいくつかの実際の努力が必要になるだろう。

それだけでWindowsがWM_COPYDATAメッセージを使用することにより、あなたのためにハードワークの世話をさせるために非常に簡単です。例はhereです。

慎重に、しかし:WM_COPYDATAは、Windows VistaにUIPIによってブロックされ、後でされます。 ChangeWindowMessageFilter関数(Vistaの場合)またはChangeWindowMessageFilterEx関数(Win 7以降の場合)を呼び出して、この特定のメッセージをホワイトリストに表示する必要があります。

+0

UIPIは、同じ完全性レベルのアプリでは問題ありません。私の見解では、ReadProcessMemoryについて言及することは悪い考えです。 –

+0

@David:はい、私はそれを認識しますが、質問は彼らが同じ完全性レベルにあるとは言いませんでした。 :-) ReadProcessMemoryについて言及してみませんか?それは間違いなくもっと複雑な方法ですが、私が気づいていない欠点がいくつかありますか? –

+0

私は、初心者が実際の状況よりもはっきりと警告するかもしれないので、明確にしていました。 ReadProcessMemoryの主な欠点は、同期が必要であることです。すべてを設定したら、WM.COPYDATAよりはるかに複雑です –

3

あなたは正しい考えを持っているが、あなたは間違ったメッセージを使用しています。あなたは、例えば、RegisterWindowMessage()からcp_struct.dwDataに値を割り当てるcp_struct.cdDataにデータのバイト長を割り当て、その後、WM_COPYDATAメッセージ(あなたが他のアプリの実際のHWNDを使用する必要は、ないHWND_BROADCAST)を使用してcp_structを送信する必要があります。

msg_number = RegisterWindowMessage(MY_WINDOW_MSG); 
if (msg_number != 0) 
{ 
    cp_struct.dwData = msg_number; 
    cp_struct.lpData = &fig; 
    cp_struct.cbData = sizeof(Figure); 
    SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)&cp_struct); 
} 

case WM_CREATE: 
{ 
    msg_number = RegisterWindowMessage(MY_WINDOW_MSG); 
    break; 
} 

case WM_COPYDATA: 
{ 
    reciver_struct = (PCOPYDATASTRUCT)(lParam); 
    if ((msg_number != 0) && (reciver_struct->dwData == msg_number)) 
    { 
     Figure *figure = (Figure*) cp_struct.lpData; 
     ... use figure as needed ... 
     return 0; 
    } 

    ... pass the message to a default handler for processing ... 
    break; 
} 
関連する問題