2008-11-12 4 views
9

Ich muss den Code schreiben, der ausgeführt wird, wenn DllRegisterServer aufgerufen wird. das heißt, wenn jemand ruft:Win32: Registrierungseinträge zum Registrieren eines ActiveX-Steuerelements erforderlich?

regsvr32 myActiveX.ocx 

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

Bisher haben meine Expeditionen gefunden:

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 Bedenken: - was ist das Steuer Ordner enthalten? Ist das Vorhandensein ein Steuerelement? - Was ist ein MiscStatus von 205201? Was würde 205202 stattdessen tun? - Was ist das Verb "Eigenschaften, 0,2"? Wo ist "Eigenschaften, 0,0" und "Eigenschaften, 0,1"?

Mit anderen Worten, ich suche nach der Dokumentation.

+1

Ich bin ein COM-Entwickler, ein Neuling ein. Ich habe die gleiche Frage. Ich möchte [this] (http://ewall.org/index.php?module=ContentExpress&func=print&ceid=22) mit Ihnen teilen. – smwikipedia

+0

Automatisieren die meisten Frameworks die Generierung nicht für Sie? – Deanna

Antwort

5

Larry Osterman bietet einen guten Startpunkt:

Ein großer Teil der „Cargo-Kult“ Natur dafür ist die Tatsache, dass es eine verwirrende Reihe von Registry Einstellungen sind, die sein können Set für COM Objekte, und es ist nicht klar, ob, wenn irgendwelche gelten. Also versuche ich eine Reihe von Artikeln zu veröffentlichen, die Menschen helfen können zu bestimmen, was sie zu setzen müssen.

- What registry entries are needed to register a COM object.

Zusammenfassung: Es hängt davon ab, welche Szenarien Sie Ihr Objekt müssen verwendet werden, um die grundlegendsten, absolut-notwendigen Einstellungen sind der Standardwert und ThreadingModel in HKEY_CLASSES_ROOT\CLSID\<clsid>\, aber die meisten der. Zeit werden Sie auch ProgIDs und AppIDs wollen.

3

Es ist nicht erschöpfend, aber versuchen Sie this MS Knowledge Base Artikel.

Auch Larry Osterman hat einen nützlichen Blog-Beitrag here.


Es fällt mir ein, dass ein anderer Ansatz, ein Tool wie RegMon und direkt zu überwachen zu verwenden wäre, was Registry-Änderungen vorgenommen werden, wenn der DllRegisterServer-Methode aufgerufen wird.

0

Auf jeden Fall, gehen Sie mit dem Larry Osterman Artikel verknüpft.

Ein guter Ausgangspunkt sind außerdem die ATL-Registrar-Skripts, die vom MSVC ATL COM-Objekt-Assistenten generiert werden. Sie können mit verschiedenen Optionen spielen und sehen, wie sie die Ausgabe beeinflussen.

5

Eine Kopie von Inside OLE 2 von Kraig Brockenschmidt finden/ausleihen/stehlen. Es ist alt wie die Welt (und datiert mich auch :-))

Hier ist auch a high-level overview der Registry-Einträge, die oben erwähnt werden.

Lesen Larry Osterman blog post für mehr Zeiger.

Schauen Sie sich die MSDN ActiveX Proben an.

Außerdem fehlen Ihnen Einträge unter HKCR \ Interfaces für alle benutzerdefinierten Schnittstellen und Ereignisschnittstellen, die von Ihrer Steuerung implementiert werden.

0

Seitliche Notiz, wenn Sie experimentell sehen möchten, welche Schlüssel erstellt werden: Verwenden Sie Sysinternals 'Process Monitor, es wird in Echtzeit die Aktivität in der Registrierung erfassen, wenn Sie das Steuerelement registrieren.

9

Was ich bisher weiß. COM erstellt ein Objekt basierend auf clsid. Dies ist eine GUID, die diese Klasse eindeutig identifiziert.

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

Diese Klasse wird dann zum Erstellen von Objekten verwendet. COM muss nun wissen, wo die DLL das COM-Objekt enthält. In meinem speziellen Fall ist der "Server", der das COM-Objekt freigibt, eine DLL und wird "in Bearbeitung" sein. Wir weisen dann COM auf dieses "in-process" dll durch Zugabe:

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

COM muss auch das Threading-Modell wissen, dass das COM-Server-Objekt unterstützt. Die einfachste, am häufigsten, und der 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 ist die Programm-ID. Dies ist ähnlich wie DNS verwendet wird, um einen benutzerfreundlichen Namen in eine IP zu verwandeln. Hier wenden wir uns einen Namen ein "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 fragen Sie nach

MyCoolLibrary.MyCoolControl 

und COM kann man erkennen, biegen Sie in die ClassID

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

Sobald COM das hat clasid kann es dann in der Registry unter HKCR\Clsid\{AE8530CF-D204-4877-9CAB-F052BF1F661F} nach den richtigen Informationen suchen.

Für Spaß ist die ProgID zu dem CLSID-Abschnitt hinzugefügt, nur damit die Menschen eine Vorstellung 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 ist die Typ-Bibliothek. Dies ist meistens un wichtig für alles In-Prozess, aber wenn das COM-Objekt in einer anderen "Wohnung" ist, dann müssen Funktionsparameter gemarshallt werden. COM tut dies automatisch für Sie, wenn es eine Typbibliothek hat, die alle Methoden der Klasse definiert.

Der CLSID-Abschnitt wird in der entsprechenden Typenbibliothek mit dem Zusatz eines TypeLib-Schlüssel hingewiesen:

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 Art Bibliothek auch in der Registrierung gespeichert wird, aber diesen Schlüssel Zugabe ist für uns getan mit ein Anruf an RegisterTypeLib. Aber es fügt Schlüssel für uns ä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 in die heikelen Sachen, Sachen, die hoffentlich zu benötigt wird ein ActiveX-Steuerelement funktioniert.

An MSDN article states, dass Sie einen Dummy-Programmierbare Schlüssel hinzufügen müssen, um anzuzeigen, dass es sich um ein ActiveX-Steuerelement ist:

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

Aber this MSDN Library page sagt das Schlüsselwort Kontrolle und nicht Programmierbare ist - und es ist kein programmierbarer Schlüssel.

Aber das hindert einige ActiveX's nicht daran, Control zu verwenden, einige verwenden Programmable und andere verwenden beides.

Ich kann nichts finden, das irgendetwas anderes erwähnt, das benötigt wird.

Kann also jemand eine definitive Dokumentation finden?

+1

"Programmierbar" scheint der richtige Schlüssel zu sein - ich konnte eine Komponente in MSOffice nicht mit 'Control' und ohne' Programmable' laden. Außerdem würde ich vorschlagen, eine Versionsnummer an die 'ProgID' (' MyCoolLibrary.MyCoolControl.1') anzuhängen und eine 'VersionIndependentProgID' ohne die angehängte Versionsnummer zu behalten. – alecov

-1

Arbeiten Sie an einem 64-Bit-Betriebssystem?

Wenn ja, anstelle des Schreibens zu
HKEY_CLASSES_ROOT \ CLSID \
Sie
HKEY_CLASSES_ROOT schreiben sollte \ Wow6432Node \ CLSID \