|
|
VC++不同环境下发送 WM_COPYDATA 的等效代码
VC++6.0发送(默认ansi码)
- WORD wIdent = 1002;
- WORD wRecog = 0;
- LPARAM nParam = MAKELONG(wRecog, wIdent); // 低位=recog, 高位=ident
- CString strMsgA =strMsg;// "需要发送的ANSI文本"; // VC6 默认就是 ANSI
- COPYDATASTRUCT cds;
- cds.dwData = static_cast<ULONG_PTR>(nParam); // 用 dwData 传你的参数
- cds.cbData = strMsgA.GetLength() + 1; // 字节数(含NUL)
- cds.lpData = (void*)strMsgA.GetBuffer(cds.cbData);// 缓冲在 SendMessage 返回后仍有效
- ::SendMessage(serverWnd->m_hWnd, WM_COPYDATA,
- (WPARAM)m_hWnd, (LPARAM)&cds); // wParam 规范应为发送窗句柄
- strMsgA.ReleaseBuffer();
复制代码 VC2019(Unicode)下
- // 发送 UTF-16 宽字符串(推荐,与 VC2019/Delphi 2009+ 默认一致)
- WORD wIdent = 1002;
- WORD wRecog = 0;
- LPARAM nParam = MAKELONG(wRecog, wIdent); // 低位=recog, 高位=ident
- CStringW msg = strMsg; // 确保是宽串
- COPYDATASTRUCT cds{};
- cds.dwData = static_cast<ULONG_PTR>(nParam); // 自定义参数
- cds.cbData = static_cast<DWORD>((msg.GetLength() + 1) * sizeof(wchar_t)); // 字节数(含NUL)
- cds.lpData = (LPVOID)msg.GetString(); // LPCWSTR 缓冲
- ::SendMessageW(serverWnd->m_hWnd, WM_COPYDATA, (WPARAM)m_hWnd, (LPARAM)&cds);
复制代码 若对方只能接收 ANSI/UTF-8,请改成按 UTF-8 发送:
- // 发送 UTF-8
- CStringW msgW = strMsg;
- int utf8Len = WideCharToMultiByte(CP_UTF8, 0, msgW, -1, nullptr, 0, nullptr, nullptr);
- std::string utf8(utf8Len, '\0');
- WideCharToMultiByte(CP_UTF8, 0, msgW, -1, utf8.data(), utf8Len, nullptr, nullptr);
- COPYDATASTRUCT cds{};
- cds.dwData = static_cast<ULONG_PTR>(nParam);
- cds.cbData = static_cast<DWORD>(utf8.size()); // 已含结尾 NUL
- cds.lpData = (LPVOID)utf8.data();
- ::SendMessageW(serverWnd->m_hWnd, WM_COPYDATA, (WPARAM)m_hWnd, (LPARAM)&cds);
复制代码 接收端需对应按 LPCWSTR(UTF-16)或按 UTF-8 解码,否则会乱码。
|
|