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?