2010-12-01 37 views
2

je définir mes interfaces dans un fichier A.idl, que je Compile à A.tlbQueryInterface de out-of-process serveur COM sur l'interface Importés depuis TLB

Dans un projet VS2005 ATL "B" J'utilise importlib (A.tlb) dans B.idl et #import "A.tlb" dans stdafx.h et implémenter une interface IA à partir de A.tlb dans une classe COM ATL. Le projet génère un B.dll et un B.tlb

J'ajoute B.tlb aux références d'une application C# et dans le code I instancie l'objet COM.

L'instanciation fonctionne sans problème si je l'utilise soit

Type.GetTypeFromCLSID(); Activator.CreateInstance(...); 

ou

[DllImport("ole32.dll", ...)] CoCreateInstance(...) 

deux fins de travail, l'objet instancie et je peux le jeter à l'interface IA définie dans A.tlb (en fait un RCW généré à partir de la tlb) et invoquer ses méthodes. Toujours pas de problèmes.

Puis j'utilise OLEView pour activer l'activation de l'objet COM en utilisant le substitut DllHost.exe par défaut.

L'instanciation de l'objet COM au sein de la mère porteuse (paramètre CLSCTX_LOCAL_SERVER dans CoCreateInstance) est toujours sans problèmes, mais lorsque je tente de jeter l'objet à l'interface IA définie à A.tlb je reçois E_NOINTERFACE et message indiquant que QueryInterface a échoué car "Aucune interface de ce type n'est prise en charge".

Aidez-nous s'il vous plaît. Quel pourrait être le problème? Si vous avez besoin d'informations supplémentaires, je vais essayer de fournir autant que possible.

+0

J'ai essayé de copier et coller tout le code idl de A.idl (struct et définitions d'interface) à B.idl, enlevé #import "A.tlb" et voila - Je peux lancer l'objet créé avec CoCreateInstance à IA et Utilisez-le sans problèmes. Cela implique que le bogue soit dans la façon dont A.tlb est compilé ou dans la façon dont j'inclue/importe la tlb ou quelque chose avec des entrées de registre pour les interfaces dans la tlb. Avez-vous des conseils sur l'utilisation correcte des interfaces définies dans un TLB? –

Répondre

2

Vous devez créer et enregistrer la DLL proxy/stub. Requis pour rassembler les interfaces à travers les limites de processus. Je ne peux pas trouver une grande page MSDN pour cela, mais c'est mentioned here.

+0

Construire et enregistrer BPS (projet proxy/stub généré) n'a pas aidé. Ai-je besoin d'éditer manuellement quelque chose dans le projet PS? –

+0

Pas habituellement. Assurez-vous que tout est enregistré correctement. Vous devez voir vos IID d'interface dans HKCR \ Interfaces avec le proxy CLSID répertorié. ProcMon de SysInternals le visualise, vous verrez COM frapper les clés de registre à la recherche du proxy. –

+1

Merci. En fin de compte, la construction et l'enregistrement du proxy/stub dll ont résolu mon problème. Un très bon article msdn est ici http://msdn.microsoft.com/en-us/library/ms688707 plus j'ai dû google solutions à quelques bugs mineurs qui sont apparus lors de la compilation. –