Я разрабатываю 4 приложения (используя основанные примеры в Интернете) для Visual Studio 2010: 2 в C ++ MFC (названные: SenderCpp и ReceiverCpp) и 2 в C # (названные: SenderCsh и ReceiverCsh) для проверки взаимодействия между процессами WM_DATACOPY.
Моя цель состоит в том, чтобы приложение C ++ «SenderCpp» отправляло некоторые данные в приложение C # «ReceiverCsh», и оно не работает, сообщение «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» никакое сообщение не отображается, когда SenderCpp отправляет WM_COPYDATA, вместо этого сообщение отображается при анализе ReceiverCpp.
У тебя есть идея?
Благодарю.
Мне интересно, если ReceiverCsh
это консольное приложение Чтобы использовать переопределение WndProc, вам нужно иметь насос сообщений, собирающийся получать внешние сообщения. Убедитесь, что это так.
Увидеть Обработка сообщений в консольных приложениях Больше подробностей
Других решений пока нет …