typedef struct aaa
{
int x;
char y[20];
}
bool test()
{
aaa b;
b.x = 1;
strcpy(b.y,"dfsdfsd");
::SendMessage(hwnd,WM_XXX,0,(LPARAM)(char*)&b);
return true;
}
如上面的例子,按理论上说,b是test()函数的内部变量,在函数完成后会自动销毁(不是用new方式来手动申请内存),这个消息到接收那方时b申请的内存应该是给自动回收的,可是接收方还是能收到正确信息?
如果说SendMessage自动把b做了一份镜像,不过b不是动过new来申请的内存,无法获取b的大小,那么又是怎么样来自动获取b的大小的?
还有,为什么一定要把b的地址声明称char* 才能正确发送?LPARAM是一个整型的指针,为什么还要专门把b转换成字符型指针? 难道是因为这个函数对字符型的指针有特殊的处理?
{
int x;
char y[20];
}
bool test()
{
aaa b;
b.x = 1;
strcpy(b.y,"dfsdfsd");
::SendMessage(hwnd,WM_XXX,0,(LPARAM)(char*)&b);
return true;
}
如上面的例子,按理论上说,b是test()函数的内部变量,在函数完成后会自动销毁(不是用new方式来手动申请内存),这个消息到接收那方时b申请的内存应该是给自动回收的,可是接收方还是能收到正确信息?
如果说SendMessage自动把b做了一份镜像,不过b不是动过new来申请的内存,无法获取b的大小,那么又是怎么样来自动获取b的大小的?
还有,为什么一定要把b的地址声明称char* 才能正确发送?LPARAM是一个整型的指针,为什么还要专门把b转换成字符型指针? 难道是因为这个函数对字符型的指针有特殊的处理?
{
TEST b;
b.x = 1;
strcpy(b.y,"dfsdfsd");
::SendMessage(m_hWnd,WM_TEST001,0,(LPARAM)(char*)&b);
}LRESULT CTEST001Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
if (message == WM_TEST001)
{
TEST* p = (TEST*)lParam;
AfxMessageBox(p->y);
}
return CDialog::WindowProc(message, wParam, lParam);
}
你的程序测试没有问题
但PostMessage就需要注意这个问题了。
在win32上LPARAM是long,在win64上LPARAM是__int64,它从来没有被当成指针