c ++ - Hvordan kopierer jeg data fra en Windows-app til en anden?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skal overføre data i win api fra en applikation til en anden.
I en app har jeg:


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); 


I en anden:


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
", reciver\_struct->cbData);
    return 0;
}


Men i denne modtager applikation ser jeg, at appen får meddelelsen, men ikke med værdierne fra min struktur.

Bedste reference


Du har den rigtige idé, men du bruger den forkerte besked. Du skal tildele værdien fra RegisterWindowMessage() til cp\_struct.dwData, tildele din datas bitlængde til cp\_struct.cdData og derefter sende cp\_struct ved hjælp af meddelelsen WM\_COPYDATA ( du skal bruge den anden apps faktiske HWND, ikke HWND\_BROADCAST), f.eks .:


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;
}

Andre referencer 1


Korrekt, du kan ikke læse fra det beskyttede hukommelsesrum i et andet program. Enhver peger eller reference, du overfører, vil være ugyldig og ubrugelig fra den modtagende applikations kontekst.


Du kan bruge noget som ReadProcessMemory for at gøre dette arbejde, men det vil tage en vis indsats. [17]


Det er meget enklere at bare lade Windows tage sig af det hårde arbejde for dig ved at bruge WM\_COPYDATA beskeden. Et eksempel er tilgængeligt her. [18] [19]


Vær forsigtig, selvom: WM\_COPYDATA er blokeret af UIPI i Windows Vista og senere. Du skal hvidliste denne besked ved at kalde funktionen ChangeWindowMessageFilter (på Vista) eller ChangeWindowMessageFilterEx funktionen (på Win 7 eller senere). [20] [21]

Andre referencer 2


Hvis du har adgang til Boost, skal du overveje Boost.Interprocess. Hvis du ikke har adgang til at øge, kan du bruge et vilkårligt antal Win API-metoder til IPC. [22] [23]