2017-04-24 58 views
0

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

// 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 (温度,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; 
}            

请帮助我明白我在做什么错了,得到这个工作

+0

我在窗体应用程序中使用此代码接收消息,但收到的数据为空,整个指针pcds为空。 – Sam

回答

0

WM_COPYDATA规定如下:传递

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

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

我建议看一下WM_COPYDATA中的例子,这个例子似乎做了你所需要的,但不是从堆中传递字符串,而是使用char数组将字符串复制到堆栈中。

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

+0

这是一个很好的观点,但我不认为它与这个问题有关。对于它的价值,我认为它可以通过将'cds.lpData =&lpszString;'更改为'cds.lpData = lpszString;'来解决,因为海报的长度(大致)是正确的。 – pjcard

相关问题