Von einem c # -Programm möchte ich WM_COPYDATA mit SendMessage verwenden, um mit einer Legacy-C ++ / CLI-MFC-Anwendung zu kommunizieren.
Ich möchte eine verwaltete Struktur übergeben, die String-Objekte enthält.
Ich kann das Handle zu der C ++ - Anwendung für die Verwendung mit SendMessage fein finden.
Das Bit, über das ich nichts weiß, ist, wie die Struktur und die Strings am anderen Ende gerastert und gelesen werden können. Zumal es Nicht-Blitables enthält.
Halten die Leute das für machbar? Ich werde weiter daran arbeiten, aber würde jemanden schätzen, der so etwas getan hat, mir zu sagen, ob es einfach nicht funktionieren wird.
Hier ist ein Demo-Code, wenn es ein C ++ / CLI-Programm ist und es nicht schwer ist, es zum Laufen zu bringen. Ich möchte jedoch, dass dies in einer .Net-Klassenbibliothek ist, so dass es leicht wiederverwendet werden kann.
%Vor%Ich habe es funktioniert.
Ein einfacher Ansatz besteht darin, die Struktur zu einer einzelnen Zeichenfolge zu serialisieren und eine Zeichenfolge zu übertragen. Der Blog von swhistlesoft war hilfreich Ссылка
Dies kann ausreichen, um das einfache Messaging bereitzustellen. Die Struktur kann bei Bedarf am anderen Ende neu konstruiert werden.
Wenn eine Struktur mit einer beliebigen Anzahl von Strings unverändert verwaltet werden soll, dann muss das eine feste Größe sein, das ist die Hauptsache, die ich nicht bekommen habe. Das
%Vor%legt im Grunde die Größe so fest, dass sie der C ++ - Größe entspricht, die in unserem Fall ein TCHAR szTest [9];
istUm eine .Net-Struktur über WM_COPYDATA von c # nach c ++ (/ cli) zu übertragen, musste ich folgendes tun:
%Vor%Um eine Zeichenfolge zu senden:
%Vor%Um eine Zeichenfolge in C ++ zu empfangen:
%Vor%Um struct zu senden:
%Vor%Um Struktur in C ++ zu erhalten:
%Vor%Bitte beachten Sie, dass es sich um einen Demo-Code handelt, der in Bezug auf Styling, Ausnahmebehandlung etc. usw. funktionieren muss.
Aus der Dokumentation:
Die übergebenen Daten dürfen keine Zeiger oder andere Verweise auf Objekte enthalten, auf die die Anwendung, die die Daten erhält, nicht zugreifen kann.
Sie müssen also Ihre Zeichenfolge in COPYDATASTRUCT.lpData packen. Wenn Sie für jede Zeichenfolge eine maximale Länge haben, können Sie sie in eine Struktur mit fester Länge einbetten
%Vor%Wenn Sie nur eine Zeichenfolge mit variabler Länge haben, können Sie die Zeichenfolge an das Ende setzen und eine Überschrift verwenden, gefolgt von Zeichenfolgedaten
%Vor%Wenn Sie mehrere Zeichenfolgen mit variabler Länge haben, können Sie immer noch eine Kopfzeile verwenden und mehr Leerzeichen für jede Zeichenfolge plus einen doppelten Null-Terminator zuweisen oder alles in eine XML-Zeichenfolge serialisieren.
Tags und Links c# interop marshalling c++-cli wm-copydata