windows - hvordan man opretter brugerdefineret wm\_copydata i mfc c ++

Indlæg af Hanne Mølgaard Plasc

Problem



Hvordan kan jeg oprette en brugerdefineret Windows-besked, der overfører data til et andet program.


Jeg beskeder mellem et GUI-program og et serverprogram. Min baggrund er i * nix programmering, og jeg er lidt tabt i Windows verden.


I øjeblikket er begge programmer skabt af Visual Studio's guiden ved at vælge 'MFC windowed application'. Nu vil jeg have en elegant måde at kommunikere mellem programmerne på. Google giver mig Cwnd-> sendmessage + registrering af dine egne meddelelser osv. Jeg kan dog ikke passere en char pointer til et andet program med standard brugerdefinerede meddelelser (godt, jeg kan men hukommelsesområdet er forkert, og programmet sigfaults). Så google giver mig igen sendmessage (WM\_COPYDATA, hparam, lparam), som er marshalled. ... Jeg løb ind i en mur.


Jeg antager, at marshallede meddelelser (eller deres data) sendes til et delt hukommelsesområde, som kun kan læses af afsenderen og modtagerprogrammet (korrekt?). Og ved at oprette en brugerdefineret besked, der har en pointer af marshalled data som lparam, kan jeg overføre ethvert objekt til et andet program (korrekt?). Hvordan gør jeg det i praksis? Jeg prøvede følgende:


pWin->SendMessage(pTargetWin, WM\_CUSTOM\_MESSAGE, pSourceWin, pData);


Ovenstående værker, hvis pData er heltal. Hvis pData er en pointer at protestere, kan jeg ikke bruge objektet på grund af den manglende marhsalling. Jeg ved, at jeg kan gøre en wrapper COPYDATASTRUCT wrapper til pData og skifte til WM\_COPYDATA. Skal jeg gøre det i stedet?


br,
Juha

Bedste reference


WM\_COPYDATA skelner for dig, forudsat at du har initialiseret den COPYDATASTRUCT, du passer på, som LPARAM (lpData er markøren, ikke dwData). Brugerdefinerede meddelelser har ikke gjort det, og du ønsker ikke at genudføre marshalling for hånd. Hvis du har brug for rangeringen, skal du bruge WM\_COPYDATA. Er det det du spørger? Det lyder som om du allerede ved svaret. [2] [3]


Hvis du har brug for at understøtte flere forskellige slags meddelelser, kan du bare sætte en enum i COPYDATASTRUCT.dwData for at angive, hvad resten af ​​dataene betyder. Hvis fire byte ikke er nok, kan du definere en overskrift på dine data.


På en eller anden måde, så længe du kan passere en stor bunke med nuller og dem, kan du kommunikere alt, hvad du vil.