none
两个独立的exe程序,其中一个通过SendMessage函数向另外一个程序发送消息,请问如何可以获取LPARAM参数指向的字符串数据? RRS feed

  • 问题

  • 就是说有两个VC++编译的程序,其中一个用SendMessage函数向另外一个程序发送一个自定义消息,并且会通过LPARAM参数附送一个字符串数据过去。那么在接收消息的那个程序里面,如何将LPARAM转换为字符串数据?

    发送消息的代码如下:
        HGLOBAL h;
        h = GlobalAlloc(GHND,256);
        CopyMemory(h,L"ABCDEF",12);
        HWND hWnd = FindWindow( NULL, L"另外一个程序的窗口标题" );
        SendMessage( hWnd, 0x488, NULL, (LPARAM)h );
        GlobalFree(h);

    就是发送了“ABCDEF”六个字符过去


    接收消息的程序,其中“0x488”就是自定义消息
        switch (message)
        {
      case 0x488:
       MessageBox( hWnd, (LPCTSTR)lParam, L"OK",MB_OK );
       break;
    }

    就是这里:MessageBox( hWnd, (LPCTSTR)lParam, L"OK",MB_OK );
    这句程序运行的时候显示内容为空,接收不到“ABCDEF”这六个字符。

    可能是我的方法不对,请问究竟如何在接收消息的程序里面讲lParam参数转换为字符串?
    da jia hao!
    2009年12月22日 10:51

答案

  • FYI.

    		COPYDATASTRUCT cs;
    		char cmd[] = {"Shutdown"};
    		int cmdLen = ::strlen(cmd) + 1;
    		HGLOBAL h = ::GlobalAlloc(GMEM_FIXED, cmdLen);
    		::memset(h, 0, cmdLen);
    		::memcpy((char*)h,cmd, cmdLen);
    		cs.dwData = NULL;
    		cs.cbData = cmdLen + 1;
    		cs.lpData = h;
    		::SendMessage(hWnd, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cs);
    		::GlobalFree(h);

    • 已标记为答案 liubin 2009年12月23日 5:30
    2009年12月23日 2:43
    版主

全部回复

  • 通常,大家都使用 WM_COPYDATA 消息,实现上述功能。楼主可以参考MSDN。
    2009年12月22日 12:36
    版主
  • 《Windows环境下32位汇编语言程序设计第2版》的第4章‘第一个窗口程序’最后部分有详细的解说。
    2009年12月22日 13:57
  • FYI.

    		COPYDATASTRUCT cs;
    		char cmd[] = {"Shutdown"};
    		int cmdLen = ::strlen(cmd) + 1;
    		HGLOBAL h = ::GlobalAlloc(GMEM_FIXED, cmdLen);
    		::memset(h, 0, cmdLen);
    		::memcpy((char*)h,cmd, cmdLen);
    		cs.dwData = NULL;
    		cs.cbData = cmdLen + 1;
    		cs.lpData = h;
    		::SendMessage(hWnd, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cs);
    		::GlobalFree(h);

    • 已标记为答案 liubin 2009年12月23日 5:30
    2009年12月23日 2:43
    版主
  • 啊!谢谢,我试过了,这个方法果然可以。


    da jia hao!
    2009年12月23日 5:30