2012-05-16 233 views
6

いくつかのリソースがありますが、この大まかなトピックに対応するオンラインでは というリソースがありますが、私の答えはまだわかりません。
PostMessageで文字列を送受信する

私は私のVB.netプロセスと私のC++プロセス間の全通信を持っていることを望みます。私はC++のプロセスからに文字列を送信できるようにしたいが、私は達成するために必要な、当分の間:

C++プロセスに文字列を送信し、それを扱います。 VBに次の関数宣言を使用し

これは私が確信がもてないいくつかのポイントを作成しますが、私はできるだけ単純にこれを維持しようとするでしょう...


Declare Function PostMessage Lib "user32" Alias "PostMessageA" (_ 
    ByVal hWnd As IntPtr, _ 
    ByVal Msg As UInteger, _ 
    ByVal wParam As IntPtr, _ 
    ByVal lParam As String _ 
) As Boolean 

メッセージを次のように送信します。 C++でメッセージを捕捉するための以下のメソッド宣言で

PostMessage(hWnd, SM_PING, Nothing, "schlampe") 

LRESULT CALLBACK newWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 

私が文字列にアクセスできるかどうかのテストは、

char buffer[50]; 
sprintf(buffer, "Received: %s", (char *)lParam); 
MsgBox(buffer); 


私は不必要であると信じる多くの詳細を超える脱脂が、尋ねると、それはあなたがたに与えられなければなりません。

私の問題は、メッセージが受信され、「扱い」である...しかし、私のテストメッセージが含まれていないC++プロセスによって作成されたメッセージボックスが(:「受け取った:」それは読み)ということです。

PostMessage/SendMessage経由でVBからC++に文字列を送信するにはどうすればよいですか?




ソリューション:

は、ソリューションの受け入れ答えを見るが、さらに、ここで私は、文字列(C++)を受け取る方法です:

LRESULT CALLBACK newWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 
    switch(uMsg) { 
     case WM_COPYDATA: 
      MsgBox("Received a WM_COPYDATA message"); 
      COPYDATASTRUCT * pcds = (COPYDATASTRUCT *)lParam; 
      LPCTSTR lpszString = (LPCTSTR)(pcds->lpData); 
      MsgBox(lpszString); 
      return 1L; 
    } 
    return CallWindowProc(instance->OriginalProcessor(), hwnd, uMsg, wParam, lParam); 
} 


最後にIPCの例hereを使用しましたメッセージをに送信してください。この例ではC#を使用してメッセージを送信していますが、コンセプトは私が必要としていただけです(このコードをVBに変換するために公園内を歩くことは言及していません)。私のVBの実装では、null文字で文字列を終了する必要はなかったことに注意してください。

+0

ウィンドウメッセージを使用する必要がありますか?あるいは、プロセス間のデータを最終目標にしていますか?後者については、それを実現するための[より良い方法](http://en.wikipedia.org/wiki/Interprocess_communication)があります。 – ulidtko

+2

これを使用する前に、 'COPYDATASTRUCT'の基本的な検証を行うべきでしょう。いくつかの悪質なアプリケーションがあなたに偽の 'WM_COPYDATA'メッセージを送ることができます。 – jamesdlin

答えて

6

Windowsメッセージを使用する場合は、WM_COPYDATAを使用して、プロセス間で文字列データを転送する必要があります。カスタムメッセージIDを使用すると、文字列データは2つの異なるプロセスアドレス空間の間でマーシャリングされません。

これがあなたの現在のコードが失敗する理由です。受信プロセスは、呼び出しプロセスのアドレス空間のメモリへのポインタlParamで渡されます。もちろん、他のプロセスでは意味がありません。

このようなデータをWindowsメッセージのプロセス間でマーシャリングする方法は他にもありますが、WM_COPYDATAははるかに簡単です。要件がはるかに複雑になる場合、Windowsメッセージよりも包括的なIPCアプローチを検討する必要があります。

+0

私は必然的にIPCを行う一般的な方法について言及したいと思います:パイプ、共有メモリ+ mutexes、ソケットなど – ulidtko

+1

@ulidtko他の方法を研究しましたが、Windowsメッセージでは面倒なことはありませんでした。あなたの懸念 – Spooky

+0

データを受け取るのに 'OnCopyData'を使う必要がありますか?私のC++ DLLが別のプロセスに注入されていることに注意することが重要です。私はまだ 'COPYDATASTRUCT'を受け取ることができるかどうか確信しています – Spooky

関連する問題