繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM