この大まかなトピックに対処するオンラインのリソースはすでにいくつかありますが、私にとって有効な答えはまだ見つかりません.
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 実装では、文字列をヌル文字で終了する必要はありませんでした。