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转换成字符型指针? 难道是因为这个函数对字符型的指针有特殊的处理?

解决方案 »

  1.   

    void CTEST001Dlg::OnBnClickedOk()
    {
          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);
    }
    你的程序测试没有问题
      

  2.   

    SendMessage是同步的,也就是说调用SendMessage的线程会等待窗口过程执行完毕才返回,不用担心内存有无效问题。
    但PostMessage就需要注意这个问题了。
    在win32上LPARAM是long,在win64上LPARAM是__int64,它从来没有被当成指针
      

  3.   

    那为什么一定要用char*呢? 用其他类型好像传不过去的?