我是跨流程沟通的新手,需要一些帮助。我希望能够将C ++程序中的字符串发送到C#程序。我的问题是结果字符串是乱码。这是我的代码:
发送程序(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);
}
}
接收程序(C#)(我已经覆盖了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;
}
答案 0 :(得分:4)
C ++中的char *是ANSI字符串(通常每个字符一个字节),C#中的char *是Unicode字符串(如WCHAR * - 每个字符两个字节)。
你实际上是从char *到WCHAR *的reinterpret_cast。这不行。在C ++端使用MultiByteToWideChar()进行转换。
答案 1 :(得分:1)
您在C ++中的字符串是ANSI。您需要在C#的某处转换为Unicode。自从我进行互操作以来已经过了几年,所以其他人必须告诉你具体如何做到这一点。
答案 2 :(得分:0)
您必须以某种方式将字符数组从ASCII转换为Unicode。 Here is a page that may help do it from the C# side