2009-03-06 6 views
3

Wir verwenden ein COM-Objektautomatisierungsmodell, um unsere Anwendung unseren Kunden zur Verfügung zu stellen.Registration Free (Regfree) COM

Sie verwenden zum größten Teil Python, um auf unsere Anwendungsschnittstelle zuzugreifen.

Da wir verschiedene Versionen der Anwendung installieren möchten (noch nicht laufen, das ist ein anderes Problem), ändern wir unsere COM-Komponenten, um regfree zu sein.

Das steht jedoch dem Zugriff von Skriptsprachen durch IDispatch-Automatisierung entgegen, da sie die Einträge in der Registrierung benötigen.

Unser Ansatz besteht darin, eine Anwendung zu erstellen, die die aktive Version unserer aktuellen Anwendung verwaltet. Es lässt den Benutzer entscheiden, welche Version er haben möchte und kümmert sich um die Registrierungseinträge.

Was sind die Alternativen zu unserem Ansatz?

Antwort

3

Dafür gibt es ein Protokoll in COM. Wenn Sie die Schnittstellen versionieren (und die GUIDs für jede Version ändern), können Sie mehrere Versionen installieren. Microsoft macht dies mit WORD usw.

Es ist möglich, eine Word.Document.5-Klasse zu erstellen, die für Version 5 der Bibliothek spezifisch ist, oder nur word.Document, das eine Instanz der höchsten Gegenwart auf der Maschine erstellt . Ich bin mir nicht sicher, ob diese Funktionalität in COM integriert ist oder imperiert werden muss, aber es lohnt sich, darauf zu schauen.

+0

Die Versionierungslösung ist natürlich nett, aber wir haben uns entschieden, dass wir die Identitäten für jede Version nicht ändern möchten. Und es löst nicht das Problem, von einem Skript auf eine ältere Version der Anwendung zuzugreifen. – PsiX

1

Nun, die Antwort wird von Ihnen selbst vorgeschlagen. Sie können eine Anwendung schreiben, die eine vollständige Liste aller Versionen von COM-Komponenten enthält. Sobald eine Version vom Benutzer ausgewählt wurde, können Sie die regsvr32-Anwendung aufrufen, um diese bestimmte Version zu registrieren.

3

Regfreie COM-Objekte können über das Objekt Microsoft.Windows.ActCtx erreicht werden.

Für die IDispatch-Automatisierung, die Einträge in der Registrierung erfordert - das ist nicht genau richtig. Ich nehme an, dass Sie die Standard-ATL-Implementierung IDispatchImpl verwenden. Wir lösten diese Lösung, indem wir unsere eigene Implementierung, IRegFreeDispatchImpl, zur Verfügung stellten, die die activation context manipulation APIs in der manner suggested here verwendet, um alle Einstiegspunkte mit einem Aktivierungskontextaktivierung/-deaktivierung in die DLL einzubetten.