Frage

Wir sind unsere Client-Seite relativ komplizierte Anwendung anzupassen (ActiveX / .NET / Delphi / C ++ / COM) SxS zu verwenden, nicht Admin-Bereitstellung und Isolierung von älteren Versionen unserer Produkte zu erreichen.

Wir konnten dieses Ziel erreichen, die für fast alle in proc Komponenten wie unsere .net ui, ui Delphi und der COM-Server wir in proc verwenden, indem Sie eine Manifest-Datei zu komponieren, die alle Bibliotheken beschrieben, die von unserem Verfahren, ohne Registrierung auf dem Client von einem der Komponenten (fast).

Und hier kommt der fast Teil: Im Moment unsere Anwendung aufruft (von ihm ist c ++ Teil) eine aus proc ActiveX-Server (Delphi-ActiveX-EXE), die wiederum selbst ruft eine anderen Satz aus proc ActiveX-Server (Third Party-Plugins, geht jedes Ding hier, Delphi, C ++, jede Sache, solange es aus proc ActiveX EXE und implementiert unsere Schnittstellen).

Wie wir SxS wissen nicht unterstützt Sie das nicht von proc ActiveX-Server. Und wir können nicht diese Objekte als in proc com-Server in unserem Hauptprozess verwenden, weil das eine große Rewrite unserer Anwendung erfordern würde, und noch schlimmer, eine Pause von unseren öffentlich zugänglichen API, die von Tool von Drittanbietern und Lieferanten verwendet wird, ein api brechen, die wir nicht zulassen können.

Wir haben zufällig auf diesem Artikel die beschreibt, wie IHTMLDocument2 aus einem Internet Explorer extrahiert werden Fenster in einem separaten Prozess ausgeführt wird. Das machte uns diesen Ansatz denken:

Wir würden eine sekundäre Satellitenanwendung / Prozess erstellen, die das ActiveX wie in Prozess-Server ausgeführt wird. Dann werden wir benutzen LresultFromObject und ObjectFromLresult eine Referenz des ActiveX-Objekt von dem Satelliten zu übertragen, Anwendung auf den Hauptanwendungsprozess. Die Satellitenanwendung wird es eigene Manifest-Datei haben, die es erlaubt in SxS-Modus auszuführen.

Die gleiche Ansatz wird genommen zwischen dieser Delphi ActiveX-EXE und den Dritten AciveX EXE Plugins

kommunizieren

Es gibt eine alternative Lösung, die für den Moment, wo wir es vorziehen, über nicht die vorgeschlagene Lösung, über der zu verwenden ist .net Remoting und .net com Proxy-Klassen den Kommunikationskanal zwischen den beiden Prozessen zu öffnen, indem die com Anfrage übersetzen auf .NET Remoting und zurück zu com auf dem zweiten Prozess.

So, hier kommt die Frage:

  1. Was denken Sie über diesen Ansatz?
  2. Haben Sie eine bessere Lösung für das Problem zu sehen?
War es hilfreich?

Lösung

Es ist möglich, zu tun. Was benötigt:

  • Eine Anwendung muss einen Server starten selbst, anstatt sich auf COM, es zu tun. Sie brauchen nicht die zusätzliche Indirektion von der Registrierung zur Verfügung gestellt, benutzen Sie einfach Createprocess ().
  • Ein Server sollte seine Klasse Fabriken in seiner Methode main () mit CoRegisterClassObject () registrieren.
  • Wichtig: die CLSID es für jede Fabrik verwendet, sollte für jede Dienstinstanz eindeutig sein geändert werden. Dadurch wird sichergestellt, dass der Client eine Verbindung zum richtigen Server. I XOR einfach den Prozess-ID mit einer Klasse Fabrik CLSID. Der Kunde kennt die Prozess-ID als auch so kann die gleiche Veränderung machen.
  • Die Anwendung sollte mit einem Sleep () Aufruf CoCreateInstance () in einer Schleife aufrufen für das Objekt Fabrik zu warten, zu erscheinen. Nicht Versagen erklären, bis mindestens 60 Sekunden vergangen sind (dieses Bit mir).
  • Sowohl die Anwendung und der Server Bedarf, ein Manifest, die für jede Proxy- / stub DLL und <file> Elemente für jede Schnittstelle eines <comInterfaceExternProxyStub> Element enthält, das remoted wird.

Andere Tipps

Alex,

nobugz ist richtig, können Sie die Running Object Table zugreifen kann eine Instanz eines COM-Objekt aus einem laufenden Prozess Ihrer Delphi Automatisierung exe erstellen.

Allerdings habe ich ein großes Problem festgestellt, dass ich erklären kann nicht. Ich kann nur das Objekt über die Variante Versandweg zugreifen, wenn diese Art und Weise zu arbeiten.

Im Grunde genommen, wenn meine Active X exe nicht registriert ist, erhalte ich ein „Schnittstelle nicht unterstützt“ Fehler, wenn ich beispielsweise versuchen, das Objekt über Schnittstellen zum Beispiel:

WebUpdate: IAutomation;

WebUpdate: = CoAutomation.Create; <- nicht funktionieren Fehler


WebUpdate: Variant;

WebUpdate: = CreateOleObject ( 'WebUpdate.Automation'); <- Adaequat

Wenn ich mit dem aktiven x exe registrieren Regserver das Problem geht weg !!

Go Figure!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top