WM_COPYDATA от c ++ до C #

Я разрабатываю 4 приложения (используя основанные примеры в Интернете) для Visual Studio 2010: 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 ++, я вижу, что при мониторинге «ReceiverCsh» никакое сообщение не отображается, когда SenderCpp отправляет WM_COPYDATA, вместо этого сообщение отображается при анализе ReceiverCpp.

У тебя есть идея?
Благодарю.

2

Решение

Мне интересно, если ReceiverCsh это консольное приложение Чтобы использовать переопределение WndProc, вам нужно иметь насос сообщений, собирающийся получать внешние сообщения. Убедитесь, что это так.

Увидеть Обработка сообщений в консольных приложениях Больше подробностей

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]