I am new to inter process communication and need some help. I want to be able to send a string from a C++ program to a C# program. My problem is that the resultant string is gibberish. Here is my code:
Sending program (C++):
void transmitState(char* myStr) { HWND hWnd = ::FindWindow(NULL, _T('myApp v.1.0')); if (hWnd) { COPYDATASTRUCT cds; ::ZeroMemory(&cds, sizeof(COPYDATASTRUCT)); cds.dwData = 0; cds.lpData = (PVOID) myStr; cds.cbData = strlen(myStr) + 1; ::SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds); } }
And the receiving program (C#) (I have already overridden the WndProc):
private void OnCopyData(ref Message m) { COPYDATASTRUCT cds = new COPYDATASTRUCT(); cds = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT)); String myStr; unsafe { myStr = new String((char*) cds.lpData); } label1.Text = myStr; }
char* in C++ is ANSI character string (usually one byte per character), char* in C# is Unicode character string (like WCHAR* – two bytes per character).
You in fact reinterpret_cast from char* to WCHAR*. This won’t work. Use MultiByteToWideChar() on C++ side to convert.