试试传递kk.operator LPCTSTR()

解决方案 »

  1.   

    使用SendMessage(WM_TEST,(WPARAM)(LPCTSTR)kk)也不行呀!
      

  2.   

    改成:
    char kk[100] ="I LOVE YOU";
    SendMessage(WM_TEST,(WPARAM)kk);
    接收过程:
    OnTest(WPARAM wparam,LPARAM lparam)
    {
    CString uu=(char*)wparam;
    AfxMessageBox(uu);
    }
      

  3.   

    //发送过程:
    //CString kk="I LOVE YOU";
    //SendMessage(WM_TEST,(WPARAM)kk);
    //接收过程:
    //OnTest(WPARAM wparam,LPARAM lparam)
    //{
    //CString uu=(CString)wparam;
    //AfxMessageBox(uu);
    //}
    //消息映射:
    //ON_MESSAGE(WM_TEST,OnTest)
    //结果发现在OnTest中无法收到kk的内容,请问大虾正确的方法!。这样做:
    Windows规定用户自定义消息为了不和系统已定义消息相冲突,应该这样定义:
    #define 消息名  消息号
    消息号通常采用WM_USER+nwindows消息具有以下两个参数:
    (1)字参数 (wParam)
    (2)长参数 (lParam)
    字参数和长参数都是32位整数,用于提供消息的附带信息,是消息传递过程中参数的载体
    通常Windows个消息号其附加信息是规定好了的,而我们自己定义消息,通常是将附加
    消息的指针做为传递值.明白了这个道理,我现在来解决你的问题,我用个对话框的程序作示范吧.在xxDlg.cpp前面加上:
    #define WM_TEST WM_USER+1用classwizzard添加Cancel按钮的消息响应函数如下:
    void CDdDlg::OnCancel() 
    {
    // TODO: Add extra cleanup here
       CString kk="I LOVE YOU";
       SendMessage(WM_TEST,(WPARAM)&kk,NULL);
    //CDialog::OnCancel();
    }在XXDlg.h中申明私有函数:
    void OnTest(WPARAM wparam,LPARAM lparam);返回到xxDlg.cpp中给出实现代码(这和你的OnTest大致一致,但既然是指针就要会操作指针)
    void CDdDlg::OnTest(WPARAM wparam,LPARAM lparam)
    {
         CString uu;
     uu=*(CString *)wparam;  //把wparam当做就是你发送字符串的指针吧
         AfxMessageBox(uu);
    }然后最重要的一步,如何知道程序有消息发送了咧?
    windows启动消息循环是这么定义的:
    MSG Msg;
    ......
    While(GetMessage(&Msg,NULL,0,0))
    {
       TranslateMessage(&Msg);
       DispatchMessage(&Msg);
    }
    对消息的处理是定义回调函数(叫窗口函数)
    LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
       switch(message)
    {
    .......
    case WM_DESTROY:
         PostQuitMessage(0);
    default:
        return  DefWindowProc(hwnd,message,wParam,lParam);
    }
    return (0);
    }好了,别让人犯糊涂了,打住,步入解决问题的最后一击:用ClassWizzard重载WindowProc函数,添加代码如下:LRESULT CXXDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    // TODO: Add your specialized code here and/or call the base class
    switch(message)
    {
    case WM_TEST:
    OnTest(wParam,lParam);
    break;
    }
    return CDialog::WindowProc(message, wParam, lParam);
    }OK,任务结束,点击cancel按钮,发送消息.....
      

  4.   

    前面的帖子太长了,没怎么看,我用的方法都是new一块内存,然后作为一个参数发过去,接收者读完数据后delete,一直工作得挺好。不过我记得有人说过好像有个专用于传递这类东西的消息传递函数,那个高手快出来说一声,到底是哪个函数!
      

  5.   

    我以前用CArray的指针做为消息的参数正确地被传输过:
    下面的....
    LONG lPointer=(LONG)&kk;
    SendMessage(WM_TEST,lPointer);
    接收过程:
    OnTest(WPARAM wparam,LPARAM lparam)
    {
    CString *puu=(CString*)wparam;
    AfxMessageBox(*puu);
    }
    可以吗!
    不过你可能要小心哦! 你是发送消息,所以可能在你的消息被处理以前有其它的消息被处理,这样可能把你的 kk 地址改变(因为你用的是CString)用char数组不用当心这个问题,但是char可能浪费你的一大堆内存哦!自己看着办吧!
      

  6.   

    leer的方法是对的,只不过SendMessage要改为SendMessage(WM_TEST,(WPARAM)((LPCTSTR)kk));且kk须为类变量,否则得使用sybyl兄的new方法来使用,CoolFired是最完整的,谢谢大家