[英]How do I copy data from one windows app to another?
我需要将Win API中的数据从一个应用程序传输到另一个应用程序。 在一个应用程序中,我有:
msg_number=RegisterWindowMessage(MY_WINDOW_MSG);
cp_struct.lpData = &fig;
cp_struct.dwData = sizeof(Figure);
cp_struct.cbData = 6666;
SendMessage(HWND_BROADCAST, msg_number, 0, (LPARAM)&cp_struct);
在另一个:
case WM_CREATE:
{
msg_number=RegisterWindowMessage(TEXT(MY_WINDOW_MSG));
}
if(msg_number != 0 && msg == msg_number)
{
reciver_struct = (PCOPYDATASTRUCT)(lParam);
printf("get it %d\n", reciver_struct->cbData);
return 0;
}
但是在此接收器应用程序中,我看到该应用程序获取了消息,但未获取结构体中的值。
您有正确的想法,但使用的是错误的消息。 您需要将RegisterWindowMessage()
的值分配给cp_struct.dwData
,将数据的字节长度分配给cp_struct.cdData
,然后使用WM_COPYDATA
消息发送cp_struct
(您需要使用其他应用程序的实际HWND
,而不是HWND_BROADCAST
),例如:
msg_number = RegisterWindowMessage(MY_WINDOW_MSG);
if (msg_number != 0)
{
cp_struct.dwData = msg_number;
cp_struct.lpData = &fig;
cp_struct.cbData = sizeof(Figure);
SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)&cp_struct);
}
。
case WM_CREATE:
{
msg_number = RegisterWindowMessage(MY_WINDOW_MSG);
break;
}
case WM_COPYDATA:
{
reciver_struct = (PCOPYDATASTRUCT)(lParam);
if ((msg_number != 0) && (reciver_struct->dwData == msg_number))
{
Figure *figure = (Figure*) cp_struct.lpData;
... use figure as needed ...
return 0;
}
... pass the message to a default handler for processing ...
break;
}
正确,您不能从另一个应用程序的受保护内存空间中读取。 从接收应用程序的上下文来看,您传递的任何指针或引用都将是无效且无用的。
您可以使用ReadProcessMemory
来完成这项工作,但这需要实际付出一些努力。
通过使用WM_COPYDATA
消息让Windows为您处理WM_COPYDATA
工作要简单得多。 这里有一个例子。
但是请小心: WM_COPYDATA
在Windows Vista及更高版本中被UIPI阻止。 您需要通过调用ChangeWindowMessageFilter
函数(在Vista上)或ChangeWindowMessageFilterEx
函数(在Win 7或更高版本上),将该特定消息列入白名单。
如果可以访问Boost,请考虑Boost.Interprocess 。 如果您无权使用boost,则可以对IPC使用任何数量的Win API方法 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.