3

Visual Studio 2010 で 4 つのアプリケーション (インターネットで確立された例を使用) を開発しています。2 つは C++ MFC (名前: SenderCpp および ReceiverCpp) で、2 つは C# (名前: SenderCsh および ReceiverCsh) で、WM_DATACOPY プロセス間通信をテストします。

私の目標は、C#アプリケーション「ReceiverCsh」にデータを送信するC++アプリケーション「SenderCpp」を用意することです。これは機能せず、「ReceiverCsh」によってメッセージが受信されません。

そう:

  • SenderCpp->ReceiverCpp: 動作
  • SenderCsh->ReceiverCsh: 動作
  • SenderCpp->ReceiverCsh: 動作しません

SenderCpp コードは次のとおりです。

void SendCopyData(HWND hFind)
{
    COPYDATASTRUCT cp;
    StackRecord record;

    record.CursorX = 1;
    record.CursorY = -1;

   _tcscpy(record.cmdline, L"Hello World!");
   cp.cbData = sizeof(record);
   cp.lpData = &record;
   cp.dwData = 12;
   SendMessage(hFind, WM_COPYDATA, NULL, (LPARAM)&cp);
}

void CCANDriverDlg::OnBnClickedButton2()
{
   HWND hWnd = ::FindWindow(NULL, CString("ReceiverCpp"));
   SendCopyData(hWnd);
}

void CCANDriverDlg::OnBnClickedButton1()
{
   HWND hWnd = ::FindWindow(NULL, CString("ReceiverCsh"));
   SendCopyData(hWnd);
}

ReceiverCsh は次のとおりです。

 protected override void WndProc(ref Message m)
    {
        switch(m.Msg)
        {
            case WM_COPYDATA:
                // Win32.CopyDataStruct st = (Win32.CopyDataStruct)Marshal.PtrToStructure(m.LParam, typeof(Win32.CopyDataStruct));
                CopyDataStruct st = (CopyDataStruct)Marshal.PtrToStructure(m.LParam, typeof(CopyDataStruct));
                //txtmessagereceive.Text = strData;

                CANMessage MsgIn = new CANMessage(8);
                MsgIn = (CANMessage)Marshal.PtrToStructure(st.lpData, typeof(CANMessage));

                // Decode the marshaled message
                txtmessagereceive.Text = "dwData = " + st.dwData.ToString() +"\r\n" +
                                        "cbData = " + st.cbData + " bytes\r\n" +
                                        "CANID = " + MsgIn.CANID.ToString() + "\r\n";
                for (int i=0; i<8; i++)
                {
                    txtmessagereceive.Text += String.Format("Data[{0}]={1}\r\n", i, MsgIn.Data[i]);
                }

                break;
            default:
                // let the base class deal with it
                base.WndProc(ref m);
                break;
        }
    }

Spy++ を使用すると、「ReceiverCsh」を監視しているときに、WM_COPYDATA が SenderCpp によって送信されたときにメッセージが表示されず、ReceiverCpp が分析されたときにメッセージが表示されることがわかります。

アイデアはありますか?ありがとう。

4

1 に答える 1

0

ReceiverCshコンソールアプリケーションかどうか疑問に思っています。WndProc オーバーライドを使用するには、外部メッセージを受信するメッセージ ポンプが必要です。これが事実であることを確認してください。

詳細については、コンソール アプリでのメッセージの処理を参照してください。

于 2013-02-07T16:50:04.277 に答える