如何将数据从一个Windows应用程序复制到另一个?

时间:2012-03-23 18:50:03

标签: c++ windows winapi

我需要将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;
}

但是在这个接收器应用程序中,我看到该应用程序获取消息,但没有使用我的struct中的值。

3 个答案:

答案 0 :(得分:3)

你有正确的想法,但你使用的是错误的信息。您需要将RegisterWindowMessage()的值分配给cp_struct.dwData,将数据的字节长度分配给cp_struct.cdData,然后使用cp_struct消息发送WM_COPYDATA(您需要使用其他应用的实际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;
}

答案 1 :(得分:2)

正确,您无法从另一个应用程序的受保护内存空间读取。您传递的任何指针或引用都将在接收应用程序的上下文中无效且无用。

您可以使用类似ReadProcessMemory的内容来完成这项工作,但这需要付出一些实际的努力。

让Windows通过使用WM_COPYDATA消息来处理您的辛苦工作要简单得多。有一个例子here

但是请注意:WM_COPYDATA在Windows Vista及更高版本中被UIPI阻止。您需要通过调用ChangeWindowMessageFilter函数(在Vista上)或ChangeWindowMessageFilterEx函数(在Win 7或更高版本上)将此特定消息列入白名单。

答案 2 :(得分:0)

如果您有权访问Boost,请考虑Boost.Interprocess。如果您无权使用提升,则可以使用任何number of Win API methods for IPC