WM_COPYDATA从c ++到C#

时间:2013-02-07 16:41:24

标签: c# c++ unmanaged managed

我正在使用Visual Studio 2010开发4个应用程序(使用互联网中的已创建示例):2个C ++ MFC(名为:SenderCpp和ReceiverCpp)和2个C#(名为:SenderCsh和ReceiverCsh)来测试WM_DATACOPY进程间通讯。

我的目标是拥有C ++应用程序" SenderCpp"将一些数据发送到C#应用程序" ReceiverCsh"并且它没有工作," 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 ++我看到监控&#34; ReceiverCsh&#34;当SenderCpp发送WM_COPYDATA时,不会显示任何消息,而是在分析ReceiverCpp时显示该消息。

你有什么想法吗? 感谢。

1 个答案:

答案 0 :(得分:0)

我想知道ReceiverCsh是否是控制台应用程序。为了使用WndProc覆盖,您需要有一个消息泵来接收外部消息。确保是这种情况。

有关详细信息,请参阅Handling Messages in Console Apps