WM_COPYDATA无法正确传递我的字符串
WM_COPYDATA won't deliver my string correctly
我尝试使用wm_copydata将字符串从一个窗口发送到另一个窗口。我的接收窗口完美地收到了消息。除了我发送的字符串不会保持完整。
这是我在发送应用程序中的代码:
HWND wndsend = 0;
wndsend = FindWindowA(0, "Receiving window");
if(wndsend == 0)
{
printf("Couldn't find window.");
}
TCHAR* lpszString = (TCHAR*)"De string is ontvangen";
COPYDATASTRUCT cds;
cds.dwData = 1;
cds.cbData = sizeof(lpszString);
cds.lpData = (TCHAR*)lpszString;
SendMessage(wndsend, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)(LPVOID)&cds);
这是接收应用程序中的代码:
case WM_COPYDATA :
COPYDATASTRUCT* pcds;
pcds = (COPYDATASTRUCT*)lParam;
if (pcds->dwData == 1)
{
TCHAR *lpszString;
lpszString = (TCHAR *) (pcds->lpData);
MessageBox(0, lpszString, TEXT("clicked"), MB_OK | MB_ICONINFORMATION);
}
return 0;
现在发生的是被称为输出中文字母的消息框。
我的猜测是我没有正确地转换它,或者我实际上没有发送字符串,而只是向其发送指针,这在接收器的窗口中提供了完全不同的数据。我不知道如何修复它。
sizeof(lpszString)
是指针的大小,但是您需要缓冲区字节中的大小。您需要使用:
sizeof(TCHAR)*(_tcsclen(lpszString)+1)
读取字符串的代码应注意不要通过阅读提供给它的cbData
的值来读取缓冲区的末尾。
请记住,sizeof
在编译时评估。当您使用它时,请将这种想法保持在脑海中,如果您发现自己使用sizeof
与您知道是动态的东西,请退后一步。
作为一个额外的免费,建议,我建议您停止使用TCHAR
并选择一个字符集。我会推荐Unicode。因此,使用wchar_t
代替TCHAR
。您已经在构建一个Unicode应用程序。
另外,lpData
是指向实际数据的指针,cbData
应该是数据的大小,但实际上您正在设置指针的大小。将其设置为字符串的长度(也可能是终止0个字符:strlen(lpszString)+1
相关文章:
- 为什么我的字符串变量没有打印完整的字符串?
- 为什么在为其分配编号后无法显示我的字符串值?
- 我的字符串数组一次打印出前两个字符串
- 我的 c 字符串复制函数正在损坏其他变量的堆栈
- 如何修复我的字符串以避免运行时错误?
- 我的字符串类的 += 运算符有问题,它没有正确连接字符串
- c_str() 只读取了我的字符串的一半,为什么?我该如何解决这个问题?是字节问题吗?
- 我不知道为什么我的字符串无法保存值
- if 语句没有比较我的字符串 C++ 中的数值
- 为什么我的字符串在错误的位置打印
- 打印我的字符串阵列时,会遇到细分错误
- 登录系统C++:输入我的字符串User&Pass后,它要求我重新输入它们
- 我从我的字符串函数返回到主函数
- 随机字符串生成器不编辑我的字符串数组 (C++)
- 如何更快地擦除我的字符串
- 我的字符串队列结构有什么问题?
- 我如何显示我的字符串
- 为什么我的字符串令牌在我的C 野牛程序中最终减少时会获得新线
- 我的参数化构造函数说我的字符串变量未定义
- MySQL C ++连接器在我插入数据库时减少了我的字符串