Win32: Registry-Einträge erforderlich, sich zu registrieren Sie ein ActiveX-Steuerelement?
muss ich den code schreiben, der ausgeführt wird, wenn DllRegisterServer genannt wird. also, wenn jemand ruft:
regsvr32 myActiveX.ocx
ich versuche zu finden, die endgültige Liste der benötigten registry-Einträge (eher als nur das, was ich kann zusammenschustern von spellunking über die Registrierung).
Bisher meine Expeditionen gefunden haben:
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, die Anliegen:
- was bedeutet der Ordner "Steuerung" enthalten? Ist es, die Präsenz zeigen, eine Kontrolle?
- was ist ein MiscStatus von 205201 tun? Was würde 205202 stattdessen tun?
- Was ist das verb "Eigenschaften", 0,2"? Wo ist Sie "Eigenschaften", 0,0" und "Eigenschaften", 0,1"?
In anderen Worten, ich bin auf der Suche für die docs.
- Ich bin ein COM-Entwickler, ein Neuling ein. Ich habe die gleiche Frage. Ich möchte zu teilen dieser mit Ihnen.
- Nicht die meisten frameworks automatisieren Sie die Generierung dieser für Sie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ich weiß, so weit. COM erstellt ein Objekt basierend auf der clsid. Dies ist eine guid, die eindeutig identifiziert die Klasse.
Diese Klasse wird dann verwendet, um Objekte zu erstellen. COM muss nun wissen, wo die DLL, die besagt, dass das COM-Objekt. In meinem speziellen Fall, der "server", stellt das COM-Objekt ist eine DLL und wird "in process". Wir haben dann Punkt COM, dass der "in-Prozess" - dll hinzufügen:
COM muss auch wissen, das threading-Modell, das die COM-server-Objekt unterstützt. Die einfachste, üblichste und in diesem Beispiel ist das Threadingmodell "Apartment":
Nächste ist die ProgID. Dies ist ähnlich wie DNS verwendet wird, um einen freundlichen Namen in eine IP. Hier biegen wir ein freundliches name
"MyCoolLibrary.MyCoolControl"
in die hässliche clsid"{AE8530CF-D204-4877-9CAB-F052BF1F661F}"
Sich jetzt jemand Fragen kann
- und COM drehen kann, die in die ClassID
Einmal COM hat die clasid, es kann dann in der registry schauen unter
HKCR\Clsid\{AE8530CF-D204-4877-9CAB-F052BF1F661F}
zu finden, die wirkliche Informationen.For fun, die Programm-Id wird Hinzugefügt, um die Clsid-Abschnitt, nur so können die Menschen haben eine Vorstellung davon, was dieser Klasse ist:
Nächste ist die Typ-Bibliothek. Dies ist vor allem unwichtig für alles, was in-Prozess, aber wenn das COM-Objekt in eine andere "Wohnung", dann die Parameter der Funktion müssen umgewandelt werden. COM macht dies automatisch für Sie, wenn es eine Typ-Bibliothek definiert alle Klassen, die Methoden.
Den clsid-Abschnitt wird darauf hingewiesen, den entsprechenden Typ Bibliothek mit dem Zusatz von ein TypeLib-Schlüssel:
Informationen über diese Art library-auch in der registry gespeichert, aber das hinzufügen dieser Schlüssel ist für uns gemacht mit einem Aufruf RegisterTypeLib. Aber es wird hinzufügen von Schlüsseln für uns ähnlich:
Nun kommen wir in die knifflige Sachen, Sachen, die gebraucht wird, um hoffentlich ein ActiveX-Steuerelement funktioniert.
Ein MSDN-Artikel gibt , dass Sie müssen hinzufügen, ein dummy Programmierbare - Taste, um anzuzeigen, dass es ein ActiveX-Steuerelement:
Aber das MSDN Library-Seite sagt das Stichwort ist Kontrolle, und nicht Programmierbare - und es gibt keine Programmierbare Taste.
Aber das bedeutet nicht aufhören, einige ActiveX-aus mit Steuern, einige mit Programmierbaren, und einige mit beiden.
kann ich nicht finden, etwas erwähnen, etwas anderes erforderlich ist.
So, jeder kann finden einige definitive Dokumentation?
Programmable
scheint der richtige Schlüssel -- ich konnte nicht laden Sie eine Komponente in MSOffice mitControl
und ohneProgrammable
. Auch, würde ich vorschlagen, zum Anhängen einer Versionsnummer, um dieProgID
(MyCoolLibrary.MyCoolControl.1
) und um eineVersionIndependentProgID
ohne die Versionsnummer angehängt.Larry Osterman bietet einen guten Startpunkt:
-- Welche registry-Einträge sind nötig zum registrieren eines COM-Objekts.
Zusammenfassung: es hängt davon ab, in welchen Szenarien Sie müssen Ihr Objekt verwendet werden. Die einfachsten, absolut notwendigen Einstellungen sind in der default-Wert und ThreadingModel in
HKEY_CLASSES_ROOT\CLSID\<clsid>\
, aber die meiste Zeit werden Sie wollen, ProgIDs und AppIDs als gut.Finden/leihen/stehlen eine Kopie in OLE 2 durch Kraig Brockenschmidt. Es ist alt wie die Welt (und die Termine mir auch :-))
Hier ist auch ein high-level-übersicht der registry-Einträge, die oben erwähnt.
Lesen von Larry Osterman ' s blog-post weitere Hinweise.
Blick auf die MSDN ActiveX Proben.
Auch, Sie sind fehlende Einträge unter HKCR\Interfaces für alle benutzerdefinierten Schnittstellen und event-Schnittstellen Ihrer Steuerung implementiert.
Es ist nicht abschließend, sondern versuchen diese MS knowledge base-Artikel.
Auch, Larry Osterman hat eine nützliche blog-post hier.
Fällt mir auf, dass ein anderer Ansatz wäre die Nutzung eines Tools wie RegMon und direkt überwachen, was änderungen an der Registrierung vorgenommen werden, wenn Ihr DllRegisterServer-Methode aufgerufen wird.
Mit allen Mitteln, gehen Sie mit Larry Osterman verlinkten Artikel.
Darüber hinaus ein guter Ausgangspunkt sind die ATL-registrar-Skripte generiert, die von der MSVC-ATL-COM-Objekt-Assistenten. Sie können spielen, mit verschiedenen Optionen und sehen, wie Sie sich auf die Ausgabe auswirken.
Seite Hinweis: wenn Sie möchten, um zu sehen, experimentell, welche Schlüssel angelegt werden: verwenden Sysinternals' Process Monitor, es zu erfassen in Echtzeit die Aktivitäten in der Registrierung, wenn Sie das Steuerelement registrieren.
Arbeiten Sie auf einem 64-bit OS?
Wenn das so ist, statt zu schreiben, um
HKEY_CLASSES_ROOT\CLSID\
Sie sollte schreiben
HKEY_CLASSES_ROOT\Wow6432Node\CLSID\