如何使用PostMessage和WM_COPYDATA发送字符串消息

时间:2017-04-24 19:24:43

标签: postmessage wm-copydata

我有两个Windows应用程序。第一个是Windows窗体应用程序。第二个是控制台应用程序。我必须从控制台应用程序向窗体应用程序发送一条消息。我注册了广播消息并使用:: PostMessage函数能够向表单应用程序发送数字消息。但是我无法发送字符串消息。请在下面找到我的代码: -

 // Sending Message (Console Application)
#define RT_UI_MSG      (WM_USER+1)
UINT msg_id = RegisterWindowMessage("Test-UI");
LPTSTR lpszString = "Hello";
    COPYDATASTRUCT cds;
    cds.dwData = 1; // can be anything
    cds.cbData = sizeof(TCHAR) * (_tcslen(lpszString) + 1);
    cds.lpData = &lpszString;
::PostMessage(HWND_BROADCAST, msg_id, WM_COPYDATA, (LPARAM)(LPVOID)&cds);

//接收消息(表单应用程序)     BEGIN_MESSAGE_MAP(CRTUIDlg,CDialogEx)        ON_WM_PAINT()        ON_WM_QUERYDRAGICON()        ON_BN_CLICKED(IDOK,& CRTUIDlg :: OnBnClickedOk)        ON_REGISTERED_MESSAGE(temp,OnRTUIMsg)        ON_BN_CLICKED(IDC_BUTTON1,& CRTUIDlg :: OnBnClickedButton1)     END_MESSAGE_MAP()

UINT temp = RegisterWindowMessage(L"Test-UI");
LRESULT CRTUIDlg::OnRTUIMsg(WPARAM wParam, LPARAM lParam)
{
    COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)lParam;
    if (pcds->dwData == 1)
    {
        LPCTSTR lpszString = (LPCTSTR)(pcds->lpData);
        // do something with lpszString...
    }
    return 0;
}                                               

请帮助我理解我做错了什么并使其正常工作

2 个答案:

答案 0 :(得分:2)

没有办法邮寄消息WM_COPYDATA。系统需要知道何时释放用于编组数据的内部缓冲区。这只有在发送时才知道,而不是在发布时。见https://blogs.msdn.microsoft.com/oldnewthing/20110916-00/?p=9623

答案 1 :(得分:0)

WM_COPYDATA声明如下:

“传递的数据不得包含对接收数据的应用程序无法访问的对象的指针或其他引用。”

但是您将源应用程序堆(lpszString)的指针包含到不受支持的结构中,因为目标应用程序无法访问源应用程序的堆。 WM_COPYDATA将按原样复制该指针,它不会复制指针引用的字符串。

我建议查看WM_COPYDATA中的示例,该示例似乎可以执行您需要的操作,但不是从堆中传递字符串,而是使用char数组将字符串复制到堆栈中。

这是示例的链接: https://msdn.microsoft.com/en-us/library/windows/desktop/ms649009(v=vs.85).aspx