Frage

COM ist bekannt, um die rückwärts-Kompatibilität möglich, wenn die Freigabe neuer Bauteile oder Anwendungen.Dies ist möglich, weil die interfaces in COM stabil sind, D. H.Sie ändern sich nicht.

Ich habe versucht, schwer zu finden, eine Referenz oder ein Buch, das sich mit einer Beschreibung, wie evole eine COM-Schnittstelle von version zu version.

Folgendes sind meine Anforderungen:

Wir haben eine Anwendung, die können werden angetrieben durch ole-Automatisierung.Neue Versionen dieser Anwendung kann installiert werden in parallel zu älteren Versionen.

COM-clients an, die diese Anwendungen verwenden können, die unabhängige version PROGID in dem Fall arbeiten Sie mit der neuesten version der Anwendung oder eine version abhängig PROGID in dem Fall arbeiten Sie mit der jeweiligen version der Anwendung.

Ändert die COM-Automatisierung, sollten Sie nicht brechen alle die Kunden.

Können Sie ein Beispiel:

#include <olectl.h>
#include <fxbase\autoif.h>

[
    uuid(A1B3A66F-806F-46a2-82D9-9C278F415148),
    lcid(-1),
    version(1.0)
]

library LIB
{   
        importlib("stdole2.tlb");

        [
            uuid(82CDE055-790A-4505-BF3E-3282170C8FC6),
            helpstring("Document"),
            oleautomation,
            dual,
            nonextensible
        ]
        interface IDocument : IDispatch
        {
                [id(0x00000001), propget, helpcontext(0x0012c94a)]
                HRESULT Name([out, retval] BSTR* psName);

                [id(0x00000001), propput, helpcontext(0x0012c94a)]
                HRESULT Name([in] BSTR psName);
        }

        [
            uuid(919B9E6E-76C0-4c23-A188-5840E5900997),
            helpstring("Application object."),
            oleautomation,
            dual,
            nonextensible
        ]
        interface IApplication : IDispatch
        {
            [id(0x00000001), propget, helpstring("Returns the active document of the application.")]
            HRESULT ActiveDocument([out, retval] IDocument** retval);
        }

        [
            uuid(E0AA6FCA-AEF1-460b-A1F9-26250C28594B),
            helpstring("Application 1.0 Class"),
            appobject
        ]
        coclass Application
        {
            [default] interface IApplication;
                                interface IDispatch;
        }
}

Können sagen, ich will publish version 2.0 der Anwendung, die einige Schnittstellen erweitert.Hier ist der naive Ansatz in version 2.0:

#include <olectl.h>
#include <fxbase\autoif.h>

[
    uuid(3D4688A2-91F8-4cd8-989A-845810A05557),
    lcid(-1),
    version(2.0)
]

library LIB
{   
        importlib("stdole2.tlb");

        [
            uuid(82CDE055-790A-4505-BF3E-3282170C8FC6),
            helpstring("Document"),
            oleautomation,
            dual
        ]
        interface IDocument10 : IDispatch
        {
                [id(0x00000001), propget, helpcontext(0x0012c94a)]
                HRESULT Name([out, retval] BSTR* psName);

                [id(0x00000001), propput, helpcontext(0x0012c94a)]
                HRESULT Name([in] BSTR psName);
        }

        [
            uuid(AF404510-216A-407e-99F4-0636AF071B68),
            helpstring("Document"),
            oleautomation,
            dual,
            nonextensible
        ]
        interface IDocument : IDocument10
        {
                [id(0x00000001), propget, helpcontext(0x0012c94a)]
                HRESULT Type([out, retval] BSTR* psType);

                [id(0x00000001), propput, helpcontext(0x0012c94a)]
                HRESULT Type([in] BSTR psType);
        }

        [
            uuid(919B9E6E-76C0-4c23-A188-5840E5900997),
            helpstring("Application object."),
            oleautomation,
            dual
        ]
        interface IApplication10 : IDispatch
        {
            [id(0x00000001), propget, helpstring("Returns the active document of the application.")]
            HRESULT ActiveDocument([out, retval] IDocument** retval);
        }

        [
            uuid(6A851C3F-21DF-4f5e-A4D6-2EF5A9D234C6),
            helpstring("Application object."),
            oleautomation,
            dual,
            nonextensible
        ]
        interface IApplication : IApplication10
        {
            [id(0x00000002), propget, helpstring("Is the application visible.")]
            HRESULT Visible([out, retval] BOOL* retval);
        }

        [
            uuid(AA760349-1682-4ab6-BF0C-C02E620715CF),
            helpstring("Application 2.0 Class"),
            appobject
        ]
        coclass Application
        {
            [default] interface IApplication;
                                interface IDispatch;
        }
}

Ist das der richtige Weg, dies zu tun?

Sollte ich eine Klasse hinzufügen Application10 und Application20 zu der Registrierung hinzufügen eines possiblitity zu instanziieren, die die verschiedenen Versionen der Anwendung für die Skript-Kunden?

Ist es richtig, die version ändern und die GUID der Typbibliothek?

IDocument in der version 2.0 verfügt über eine neue IID.Kann ich trotzdem mit IDocument in IApplication.ActiveDocument?

Wie soll ich mich der Co-Klasse oder Schnittstelle in der Windows-Registry in verschiedenen Versionen?

Bitte beachten Sie, dass ich nicht die Verwendung von ATL oder anderen Bibliotheken, die andere als die WIN32-API.

Wenn Sie wissen, wo kann ich finden Informationen auf dieser (Bücher, Referenzen, etc.) bitte schlage ein.

Ich würde wirklich zu schätzen Ihre Hilfe.

War es hilfreich?

Lösung

Ja, Sie ändern müssen die Klasse id von Ihr Objekt, wenn Sie mehrere Versionen nebeneinander existieren.Jedoch können Sie halten eine version-independent Programm-id wie "Wort.Anwendung" oder "InternetExplorer.Anwendung", Weiterleitungen auf die Klassen-id der aktuellen version.Abwärtskompatibilität ist sehr schwer zu pflegen.MSXML offenbar aufgegeben, die Praxis der versionsunabhängige progID .

Wenn Sie sich entscheiden, zu halten alten Schnittstellen (empfohlen), den Sie implementieren müssen, alte und neue Schnittstellen in Ihrem neuen Objekt.

Möglicherweise möchten Sie überprüfen, Microsoft Office-registry-Einträge.Es behält die Abwärtskompatibilität ganz gut.

Vorgeschlagenen Namen für neue Schnittstellen wäre interfact name und Versionsnummer, wie IHtmlDocument6.

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