簡體   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