11 Stimmen

Win32: Registrierungseinträge für die Registrierung eines ActiveX-Steuerelements?

Ich muss den Code schreiben, der ausgeführt wird, wenn DllRegisterServer aufgerufen wird, d.h. wenn jemand aufruft:

regsvr32 myActiveX.ocx

Ich versuche, die endgültige Liste der erforderlichen Registrierungseinträge zu finden (und nicht nur das, was ich durch Durchforsten der Registrierung zusammenschustern kann).

Bislang haben meine Expeditionen Folgendes ergeben:

HKEY_CLASSES_ROOT
   \MyCoolLibrary.MyCoolControl
      \Clsid
         (default) = "{myClassId}"
   \CLSID
      \{myClassId}
         \Control
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
         \MiscStatus
            \1
               (default) = 205201
         \ProgID
            (default) = "MyCoolLibrary.MyCoolControl"
         \ToolboxBitmap32
            (default) = "c:\foo\myActiveX.ocx,1"
         \TypeLib
            (default) = "{myTypeLibraryGuid}"
         \Verb
            \0
               (default) = "Properties,0,2"
         \Version
            (default) = "1.0"
   \TypeLib
      \{myTypeLibraryGuid}
         \1.0
            (default) = "MyCoolLibrary.MyCoolControl"

Nun zu den Bedenken: - Was enthält der Ordner "Control"? Weist sein Vorhandensein auf ein Steuerelement hin? - Was bewirkt ein MiscStatus von 205201? Was würde 205202 stattdessen tun? - Was ist das Verb "Eigenschaften,0,2"? Wo befinden sich "Eigenschaften,0,0" und "Eigenschaften,0,1"?

Mit anderen Worten, ich suche nach den Dokumenten.

14voto

Ian Boyd Punkte 232380

Was ich bis jetzt weiß. COM erstellt ein Objekt auf der Grundlage seiner clsid . Dies ist eine Kennung, die diese Klasse eindeutig identifiziert.

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}

Diese Klasse wird dann zur Erstellung von Objekten verwendet. COM muss nun wissen, wo sich die DLL befindet, die das COM-Objekt enthält. In meinem speziellen Fall ist der "Server", der das COM-Objekt bereitstellt, eine DLL und wird "in Bearbeitung" sein. Wir verweisen dann COM auf diese "in-process" DLL, indem wir hinzufügen:

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"

COM muss auch das Threading-Modell kennen, das das COM-Serverobjekt unterstützt. Das einfachste und gebräuchlichste Modell, das auch in diesem Beispiel verwendet wird, ist das "Apartment"-Threading-Modell:

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"

Als nächstes folgt die ProgID. Dies ist vergleichbar mit der Verwendung von DNS, um einen freundlichen Namen in eine IP zu verwandeln. Hier verwandeln wir einen freundlichen Namen "MyCoolLibrary.MyCoolControl" in die hässliche clsid "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
HKEY_CLASSES_ROOT
    \MyCoolLibrary.MyCoolControl
       \Clsid
           (default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"

Jetzt kann jemand nachfragen

MyCoolLibrary.MyCoolControl

und COM kann dies in die ClassID umwandeln

{AE8530CF-D204-4877-9CAB-F052BF1F661F}

Sobald COM die clasid hat, kann es in der Registry unter HKCR\Clsid\{AE8530CF-D204-4877-9CAB-F052BF1F661F} um die richtigen Informationen zu finden.

Die ProgID wird spaßeshalber zum Abschnitt Clsid hinzugefügt, damit die Leute eine Vorstellung davon haben, was diese Klasse ist:

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
         \ProgID
             (default) = "MyCoolLibrary.MyCoolControl"
HKEY_CLASSES_ROOT
    \MyCoolLibrary.MyCoolControl
       \Clsid
           (default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"

Als nächstes folgt die Typbibliothek. Diese ist hauptsächlich un Wenn sich das COM-Objekt jedoch in einem anderen "Appartement" befindet, müssen die Funktionsparameter übertragen werden. COM erledigt dies automatisch für Sie, wenn es über eine Typbibliothek verfügt, die alle Methoden der Klasse definiert.

Der clsid-Abschnitt verweist auf die entsprechende Typbibliothek mit dem Zusatz eines TypeLib-Schlüssels:

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
         \ProgID
             (default) = "MyCoolLibrary.MyCoolControl"
         \TypeLib            
             (default) = "{17A5A3D4-439C-4C2A-8AB4-749B7771CDE1}"
HKEY_CLASSES_ROOT
    \MyCoolLibrary.MyCoolControl
       \Clsid
           (default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"

Informationen über diese Typbibliothek werden auch in der Registrierung gespeichert, aber das Hinzufügen dieser Schlüssel wird für uns mit einem Aufruf von RegisterTypeLib . Aber es wird Schlüssel für uns hinzufügen, ähnlich wie:

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \InprocServer32
            (default) = "c:\foo\myActiveX.ocx"
            ThreadingModel = "Apartment"
         \ProgID
             (default) = "MyCoolLibrary.MyCoolControl"
         \TypeLib            
             (default) = "{17A5A3D4-439C-4C2A-8AB4-749B7771CDE1}"
HKEY_CLASSES_ROOT
    \MyCoolLibrary.MyCoolControl
       \Clsid
           (default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"
HKEY_CLASSES_ROOT
    \TypeLib
        \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
           \1.0
              (default) = "My Cool ActiveX Library"
           ...

Jetzt kommen wir zu den kniffligen Dingen, die notwendig sind, um hoffentlich ein ActiveX-Steuerelement zum Laufen zu bringen.

In einem MSDN-Artikel heißt es dass Sie einen Dummy hinzufügen müssen Programmierbar Taste, um anzuzeigen, dass es sich um ein ActiveX-Steuerelement handelt:

HKEY_CLASSES_ROOT
   \Clsid
      \{AE8530CF-D204-4877-9CAB-F052BF1F661F}
         \Programmable

Aber diese MSDN Library-Seite sagt, das Schlüsselwort ist Kontrolle und nicht Programmierbar - und es gibt keine programmierbare Taste.

Das hindert aber einige ActiveX nicht daran, Control, andere Programmable und wieder andere beides zu verwenden.

Ich kann keinen Hinweis darauf finden, dass etwas anderes erforderlich ist.

Kann jemand eine endgültige Dokumentation finden?

5voto

Shog9 Punkte 151504

Larry Osterman bietet einen guten Ausgangspunkt:

Ein großer Teil des "Cargo-Kults" ist die Tatsache, dass es eine eine verwirrende Menge von Registrierungs die für COM-Objekte gesetzt werden können Objekte gesetzt werden können, und es ist nicht klar, welche, wenn überhaupt zutreffen. Daher versuche ich, eine Reihe von eine Reihe von Artikeln zu erstellen, die den zu bestimmen, was sie einstellen müssen festlegen.

-- Welche Registrierungseinträge sind für die Registrierung eines COM-Objekts erforderlich?

Zusammenfassung: Es kommt darauf an, in welchen Szenarien Sie Ihr Objekt verwenden wollen. Die grundlegendsten, absolut notwendigen Einstellungen sind der Standardwert und das ThreadingModel in HKEY_CLASSES_ROOT\CLSID\<clsid>\ aber in den meisten Fällen werden Sie auch ProgIDs und AppIDs benötigen.

5voto

Franci Penov Punkte 73239

Finden Sie ein Exemplar von Inside OLE 2 von Kraig Brockenschmidt oder leihen oder stehlen Sie es. Es ist so alt wie die Welt (und datiert auch mich :-))

Hier ist auch ein Überblick auf hohem Niveau der oben genannten Registrierungseinträge.

Lesen Sie Larry Osterman's Blog-Beitrag für weitere Hinweise.

Sehen Sie sich die MSDN ActiveX Proben.

Außerdem vermissen Sie Einträge unter dem HKCR \Interfaces für alle benutzerdefinierten Schnittstellen und Ereignisschnittstellen, die Ihr Steuerelement implementiert.

3voto

Stu Mackellar Punkte 11402

Sie ist nicht erschöpfend, aber versuchen Sie es este MS Knowledge Base Artikel.

Auch, Larry Ostermann hat einen nützlichen Blogbeitrag ici .


Eine andere Möglichkeit wäre die Verwendung eines Tools wie RegMon und direkt überwachen, welche Änderungen in der Registrierung vorgenommen werden, wenn Ihre DllRegisterServer-Methode aufgerufen wird.

0voto

peterchen Punkte 39679

Lesen Sie auf jeden Fall den verlinkten Artikel von Larry Osterman.

Ein guter Ausgangspunkt sind auch die ATL-Registrar-Skripte, die vom MSVC ATL COM-Objekt-Assistenten erstellt werden. Sie können mit verschiedenen Optionen spielen und sehen, wie sie die Ausgabe beeinflussen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X