C++/C#之间用WM_COPYDATA通信需要注意点:
1、只能使用SendMessage发送,需注意程序阻塞
2、接收端最好接收数据指针,再转换为对应数据。直接接收字符串会出现转换失败的情况
3、发送的内容无法支持Unicode,只能转换为多字节,否则会接收数据不全
4、接收端收到数据后,需进行字符串截取
附对应代码:
一、C#接收端
[StructLayout(LayoutKind.Sequential)]
private struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
public IntPtr lpData;
}
处理函数
case WM_COPYDATA:
COPYDATASTRUCT data = (COPYDATASTRUCT)Marshal.PtrToStructure(lParam, typeof(COPYDATASTRUCT));
string strLpData = (string)Marshal.PtrToStringAnsi(data.lpData);
strLpData = strLpData.Substring(0, 实际数据长度);
dosomething...
二、C++发送端
发送内容转换为多字节
string strData = 发送的内容;
COPYDATASTRUCT CopyData;
CopyData.dwData = 0;
CopyData.cbData = strData.size();
CopyData.lpData = (void*)strData.c_str();
SendMessage(接收窗口, WM_COPYDATA, NULL, (LPARAM)&CopyData);