2008-11-12 13 views
9

J'ai besoin d'écrire le code qui s'exécute quand DllRegisterServer est appelé. à savoir quand quelqu'un appelle:Win32: Entrées de registre requises pour enregistrer un contrôle ActiveX?

regsvr32 myActiveX.ocx 

je suis en train de trouver la liste définitive des entrées de registre requises (plutôt que ce que je peux concocter par spellunking dans le registre).

Jusqu'à présent, mes expéditions ont trouvé:

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" 

Maintenant, les préoccupations: - qu'est-ce que le dossier de contrôle contiennent? Est-ce que sa présence indique un contrôle? - qu'est-ce qu'un MiscStatus de 205201 faire? Que ferait 205202 à la place? - Quel est le verbe "Properties, 0,2"? Où est "Propriétés, 0,0" et "Propriétés, 0,1"?

En d'autres termes, je cherche les docs.

+1

Je suis un développeur COM, un débutant un. J'ai la même question. Je voudrais partager [ceci] (http://ewall.org/index.php?module=ContentExpress&func=print&ceid=22) avec vous. – smwikipedia

+0

La plupart des frameworks n'automatisent pas la génération de ceci pour vous? – Deanna

Répondre

5

Larry Osterman offre un bon point d'arrêt de saut:

Une grande partie de la nature « culte du cargo » de ceci est le fait qu'il y sont un ensemble déconcertant de registre paramètres qui peuvent être définir pour COM objets, et il n'est pas clair lequel, si s'applique. Donc, je tente de jeter sur une série d'articles qui peuvent aider les gens à déterminer ce dont ils ont besoin pour ensemble.

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

Résumé: cela dépend de scénarios que vous avez besoin de votre objet à utiliser dans les plus élémentaires, les paramètres absolument nécessaires sont la valeur par défaut et ThreadingModel dans HKEY_CLASSES_ROOT\CLSID\<clsid>\, mais la plupart du. Vous aurez également besoin de ProgID et d'AppID.

3

Ce n'est pas exhaustif, mais essayez l'article this de base de connaissances MS.

En outre, Larry Osterman a un blog utile here.


Il me semble qu'une autre approche serait d'utiliser un outil comme RegMon et surveiller directement les changements de registre sont faites lorsque votre méthode DllRegisterServer est appelée.

0

Certainement, aller avec l'article Larry Osterman lié. De plus, les scripts du registrar ATL générés par l'expert MSVC ATL COM constituent un bon point de départ. Vous pouvez jouer avec différentes options et voir comment elles affectent la sortie.

5

Trouver/emprunter/voler une copie de Inside OLE 2, par Kraig Brockenschmidt. Il est vieux comme le monde (et date moi aussi :-))

Voici également a high-level overview des entrées de registre mentionnées ci-dessus.

Lisez le blog post de Larry Osterman pour plus de pointeurs.Voir les échantillons MSDN ActiveX.

De même, il vous manque des entrées sous les interfaces HKCR \ pour toutes les interfaces personnalisées et les interfaces d'événements que votre contrôle implémente.

0

Remarque secondaire si vous voulez voir expérimentalement quelles clés sont créées: utilisez le Process Monitor de Sysinternals, il va capturer en temps réel l'activité sur le registre lorsque vous enregistrez le contrôle.

9

Ce que je sais jusqu'à présent. COM crée un objet basé sur clsid. Ceci est un guid qui identifie de façon unique cette classe.

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

Cette classe est ensuite utilisée pour créer des objets. COM doit maintenant savoir où est la DLL qui contient cet objet COM. Dans mon cas particulier, le "serveur" qui expose l'objet COM est une DLL et sera "en cours". Nous précisons alors COM que dll « en cours » en ajoutant:

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

COM doit également connaître le modèle de thread que l'objet serveur COM prend en charge. Le plus simple, le plus courant, et celui utilisé dans cet exemple est le « Appartement » modèle de thread:

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

Suivant est le ProgID. Ceci est similaire à la façon dont DNS est utilisé pour transformer un nom convivial en adresse IP. nous nous tournons ici un nom convivial "MyCoolLibrary.MyCoolControl" dans le CLSID laid "{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}" 

Maintenant, quelqu'un peut demander

MyCoolLibrary.MyCoolControl 

et COM peut le transformer en le ClassID

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

Une fois COM a clasid, il peut alors chercher dans le registre sous HKCR\Clsid\{AE8530CF-D204-4877-9CAB-F052BF1F661F} pour trouver l'information réelle.

Pour le plaisir, le ProgID est ajouté à la section Clsid, juste pour que les gens peuvent avoir une certaine idée de ce que cette classe est:

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}" 

Suivant est la bibliothèque de type. C'est en général un important pour tout ce qui est en cours de traitement, mais si l'objet COM est dans un autre "appartement", alors les paramètres de fonction doivent être rassemblés. COM le fait automatiquement pour vous s'il dispose d'une bibliothèque de types qui définit toutes les méthodes de classes.

La section CLSID est pointée vers la bibliothèque de type approprié avec l'ajout d'une clé TypeLib:

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}" 

Informations sur cette bibliothèque de type est également stockée dans le registre, mais l'ajout de ces clés est fait pour nous avec un appel au RegisterTypeLib. Mais il ajoutera des clés pour nous semblable à:

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" 
      ... 

Maintenant, nous entrons dans les choses difficiles, des choses qui est nécessaire pour , espérons- faire un travail de contrôle ActiveX.

An MSDN article states que vous devez ajouter une factice clé programmable pour indiquer qu'il est un contrôle ActiveX:

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

Mais this MSDN Library page dit le mot-clé est contrôle, et non programmable - et il est non Clé programmable.

Mais cela n'empêche pas certains ActiveX d'utiliser Control, certains utilisant Programmable, d'autres utilisant les deux.

Je ne trouve rien qui mentionne autre chose. Donc, quelqu'un peut-il trouver une documentation définitive?

+1

'Programmable' semble être la bonne clé - je ne pouvais pas charger un composant dans MSOffice avec' Control' et sans 'Programmable'. Aussi, je suggère d'ajouter un numéro de version à 'ProgID' (' MyCoolLibrary.MyCoolControl.1') et de garder un 'VersionIndependentProgID' sans le numéro de version ajouté. – alecov

-1

Travaillez-vous sur un système d'exploitation 64 bits?

Si oui, au lieu d'écrire à
HKEY_CLASSES_ROOT \ CLSID \
vous devez écrire à
HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID \