Outproc Server (eigene Exe) in einem Fenster (Panel) des Client laufen lassen?
-
Hallo,
ich habe einen COM Server und Client (beide mit einer TForm). Die Kommunikation untereinander funktioniert. Ich möchte nun aber nicht zwei eigenständige Fenster haben, sondern das Fenster des Servers soll auf ein Panel im Client dargestellt werden.Bei Forms im eigenen Projekt weise ich dem Parent des Fensters einfach den Pointer auf das PAnel zu und es funktioniert. Hier send eich den Pointer des Panels über eine COM Funktion an den Server und weise es dem Parenet zu. Doch hier verschwindet das Fenster einfach und liegt nicht auf dem Panel.
Geht es überhaupt oder ist es unmöglich eine zweite EXE auf einem PAnel darzustellen?
Gruss
Jörn
-
Das dürfte nicht funktionieren, da es sich um zwei verschiedene Prozesse mit eigenen Adressräumen handelt.
-
DocShoe schrieb:
Das dürfte nicht funktionieren, da es sich um zwei verschiedene Prozesse mit eigenen Adressräumen handelt.
Das ist kein Hindernis; prominente Beispiele sind z.B. Google Chrome und Internet Explorer 8. Allerdings bin ich nicht über die technischen Details informiert.
(Btw: Willkommen unter den Registrierten
)
-
Ich gehe auch mal schwer davon aus, dass weder Chrome noch der IE mit der VCL programmiert wurden. Ich weiss nicht genau, wie es aussieht, wenn man statt der Zeiger auf VCL Objekte mit nativen Win32 Handles arbeitet, aber wenn ein Zeiger auf ein VCL Objekt (das mit Sicherheit nicht im Kernelspace liegt) per IPC an einen anderen Prozess mit einem anderen virtuellen Adressraum verschickt wird kann der Zeiger nicht mehr gültig sein bzw. wenn er es wider Erwarten doch ist dann nur dank undefiniertem Verhalten.
-
DocShoe schrieb:
Ich weiss nicht genau, wie es aussieht, wenn man statt der Zeiger auf VCL Objekte mit nativen Win32 Handles arbeitet, aber wenn ein Zeiger auf ein VCL Objekt (das mit Sicherheit nicht im Kernelspace liegt) per IPC an einen anderen Prozess mit einem anderen virtuellen Adressraum verschickt wird kann der Zeiger nicht mehr gültig sein bzw. wenn er es wider Erwarten doch ist dann nur dank undefiniertem Verhalten.
Natürlich. Falls das irgendwie funktioniert, dann über Window-Handles, nicht per Übergabe von Zeigern.
Eine weitere praktische Anwendung einer derartigen Technik wäre das Preview-Fenster in desk.cpl. Die Dokumentation dazu legt nahe, daß HWNDs auch über Prozeßgrenzen hinweg gültig sind.
-
So,
nache einigem probieren habe ich es doch hinbekommen. Die Übergabe des Handles war wohl das Problem und man muss ParentWindow statt Parent nehmen.Um die Übergabe zu eliminieren habe ich einfach so probiert:
HWMD TargetWindow = FindWindow(NULL, "MyWindow"); ParentWindow = TargetWindow;
Da es so funktionierte, war der Fehler in der Übergabe des Parameters zu suchen. Hatte auf OLE_HANDLE gecastet, was aber wohl nicht ging. Habe jetzt int genommen und es funktioniert.
Gruss
Jörn