7

この大まかなトピックに対処するオンラインのリソースはすでにいくつかありますが、私にとって有効な答えはまだ見つかりません.

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

そして、メッセージを次のように送信します。

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

C++でメッセージをキャプチャするための次のメソッド宣言を使用します。

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 の例を使用してメッセージを送信しました。この例では C# を使用してメッセージを送信しますが、必要なのはその概念だけでした (そのようなコードを VB に変換するのは公園を散歩することであることは言うまでもありません)。私の VB 実装では、文字列をヌル文字で終了する必要はありませんでした。

4

1 に答える 1

6

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

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

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

于 2012-05-16T13:14:43.383 に答える