2012-06-18 2 views
9

Est-il possible d'utiliser l'objet COM à partir de DLL sans enregistrer dans le code C++ non géré?Utiliser l'objet COM à partir de DLL sans registre

+0

@NahumLitvin, pouvez-vous dire quelle bibliothèque vous intéresse spécifiquement? – acelent

+0

Malheureusement, je ne peux pas. l'information n'est pas à moi de donner. J'ai un com dll. et un exemple de travail avec enregistrement. mais je ne peux pas utiliser l'enregistrement. – Nahum

+0

Pourquoi n'avez-vous pas fait une nouvelle question? Pourquoi ne pouvez-vous pas utiliser l'enregistrement gratuit COM (voir l'une des réponses)? Avez-vous essayé la méthode expliquée dans l'autre réponse? Si cela n'a pas fonctionné, à quelle étape avez-vous eu une erreur? Vraiment, cela ne réserve pas une prime sur une question déjà répondu, cela devrait être sa propre question. Vous devez fournir beaucoup plus de détails si vous voulez vraiment de l'aide, au lieu de simplement jeter des points de réputation. – acelent

Répondre

8

Oui, s'il ne dépend pas de manière interne d'autres objets enregistrés.

  1. Vous LoadLibrary la DLL
  2. Vous GetProcAddress son DllGetClassObject
  3. Vous appelez DllGetClassObject pour obtenir le pointeur IClassFactory pour CLSID d'intérêt
  4. Vous êtes bon d'aller avec IClassFactory::CreateInstance et instancier le coclasse
+4

2 ½. Assurez-vous que vous êtes dans le bon appartement avant d'appeler 'DllGetClassObject'. Même ainsi, vous n'obtiendrez pas de marshaling pour les interfaces de modèle objet spécifiques. Même si les objets COM C++ implémentent 'IMarshal' ou' IProvideClassInfo' eux-mêmes, vous devrez faire la même chose si vous êtes celui fournissant des objets qui implémentent l'une de ces interfaces (par exemple dispinterfaces d'événements). Pour ces raisons et bien d'autres, c'est une mauvaise pratique. Vous devriez utiliser l'enregistrement gratuit COM à la place. – acelent

2

Disons que la DLL COM doit être enregistrée, mais que l'application ne dispose pas de droits d'accès administrateur. Voici un bidouille facile d'enregistrer la DLL sous HKEY_CURRENT_USER, qui ne nécessite pas de droits d'administrateur:

  1. Utilisez LoadLibrary pour charger la DLL COM.
  2. Appelez GetGetProcAddress pour obtenir l'adresse de DllRegisterServer.
  3. Appelez le RegOverridePredefKey pour rendre les redirections temporaires du registre: HKEY_LOCAL_MACHINE à HKEY_CURRENT_USER et HKEY_CLASSES_ROOT à HKEY_CURRENT_USER\Software\Classes.
  4. Appelez le DllRegisterServer obtenu à l'étape 2.
  5. Inversez les redirections du Registre.
  6. Utilisez le serveur COM comme d'habitude, il est maintenant enregistré sous HKEY_CURRENT_USER.
+1

piratage "facile". Intelligent cependant. – Dmitry