TL; DR Müssen alle von regsvr32
produzierten Registrierungseinträge in einem SxS-Manifest "reg-free-COM" vorhanden sein und umgekehrt?Welche Tags sind im Manifest für registrierungsfreie COM erforderlich?
Ich versuche, Registrierung frei COM für eine Drittanbieter-Komponente gehen.
Readingupon das Thema, finde ich, dass es mehr Elemente genannt, die in ein manifest gesetzt werden können:
From the docs, können wir die folgenden Tags zu einem Manifest hinzufügen eine COM-Komponente zu beschreiben:
assemblyIdentity
- die wirklich beschreibt nur die "abstrakte assembly" so weit wie ich kann sagen,comClass
- beschreibt die COM-Klasse (IID In Oberfläche). Es scheint, das wird immer benötigt.typelib
- wann?comInterfaceExternalProxyStub
- wann?comInterfaceProxyStub
- wann?
From the other docs for HKEY_LOCAL_MACHINE\SOFTWARE\Classes
wir beobachten können, dass es einige Kategorien für die COM-Registrierungseinträge sind:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{CLSID}
Ich gehe davon aus entspricht in etwacomClass
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{IID}
-entsprechen würde entwedercomInterface[External]ProxyStub
, aber Ich habe ernsthaft keine Ahnung wann zu verwenden, welche (oder beide)- Welcher Registrierungseintrag entspricht dem Manifesteintrag
typelib
?
regsvr42 Mit dem Zeug die DLL zu extrahieren ich regfree bin versucht, ergibt sich ein Manifest, das nur comClass
Einträge enthält, keine typelib oder ProxyStub Einträge. (Und ich kreuze überprüfte die Schlüssel geschrieben, die DLL in Frage pdm.dll
, MS Process Debug Manager schreibt nur diese Schlüssel, das heißt, es gibt keine Typbibliothek oder Proxy-Stub-Informationen in der Registrierung ersichtlich.)
Wenn die Registrierung enthält nur die Informationen, die sich auf comClass
beziehen Bedeutet dies, dass diese Informationen im SxS-Manifest ausreichen oder zusätzliche Informationen im Manifest benötigt werden?
Als Nebenwirkung bemerkte ich, dass die Registrierung ein VersionIndependentProgId
und ein ProgId
enthält, die eine Versionsnummer am Ende angefügt hat. Das Manifest hat nur einen ProgId
Eintrag und die Dokumentation Zustand:
PROGID: Version abhängige Programmbezeichner mit der Komponente COM verbunden. Das Format einer ProgID ist
<vendor>.<component>.<version>
.
Aber die docs sagen, auch
Das ComClass Element
<progid>...</progid>
Elemente wie Kinder haben können, die die Version abhängig ProgIDs Liste.
und they say dass das progid-Attribut die versionsunabhängige sein sollte.
Also, was hier zu setzen? Und spielt es überhaupt eine Rolle, wenn der Client keine bestimmte Version anfordert?
PDM wird keine Typbibliothek haben, es hat keine IDispatch-Schnittstellen und Sie müssen CoCreateInstance() verwenden. Und es quakt wie eine freie Thread-in-Prozess-Komponente, so dass kein Proxy/Stub benötigt wird. Was geht hier eigentlich schief? –
@Hans, danke. Nichts geht als solches schief, aber ich war mir nicht sicher, ob es irgendwelche Fallstricke gab. (COM macht mir immer das Gefühl, als würde ich etwas vermissen.) Wenn Sie mir helfen könnten, meine Geschwafel in zwei oder drei wirklich nützliche Fragen zu entwirren, würde ich das schätzen. Ansonsten bin ich zufrieden damit, dass du denkst, alles ist in Ordnung :-) –