2010-01-29 5 views
3

J'ai une bibliothèque qui exporte une routine C non managée qui renvoie des pointeurs vers des objets COM IUnknown. La DLL n'est pas enregistrée et n'est pas serveur. Je voudrais utiliser les types COM de C#.Obtention d'objets COM à partir d'un code non managé

J'ai déjà écrit des interfaces C# pour les types COM. Quel est l'équivalent C# d'appel LoadLibrary() et GetProcAddress()? Comment j'appellerais le résultat de GetProcAddress() et puis l'appel pour charger un pointeur d'interface COM?

Voici un extrait de C++ qui illustre ce que je suis après:

// Assume I have previously declared IMyType 
HANDLE mylib = ::LoadLibrary("myfakecom.dll"); 
IUnknown* (*GetterFunc) getter; 
getter = (GetterFunc)::GetProcAddress(mylib, "GetFactory"); 
IUnknown *unk = getter(); 
IMyType *mytype = unk->QueryInterface(IID_MYTYPE); 

Mon intestin dit « Faites-le avec C++/CLI », bien que je ne suis pas sûr de la façon dont je le faire pour tout type générique , et comment je contraindre les pointeurs IUnknown brutes dans les types de pointeur de gestionnaire que je déclarerais en utilisant les attributs [Guid] sur une interface gérée.

+0

Vous devriez faire une nouvelle question plutôt que d'essayer de réutiliser celle-ci pour demander un suivi. Nouvelle question signifie de nouveaux yeux. –

Répondre

1

Vous avez juste besoin d'utiliser Interop pour décrire votre fonction GetFactory, quelque chose comme ça

[DllImport("myfakecom.dll")] 
[return: MarshalAs(UnmanagedType.IUnknown)] 
static extern object GetFactory(); 

Ensuite, une fois que vous avez l'objet en code managé. Un casting est l'équivalent de QueryInterface

void Foo(Object unk) 
{ 
    IMyType mytype = (IMyType)unk; 
} 

Vous devrez dupliquer vos définitions de l'interface C++ comme des définitions d'interface C#, peut-être avec [MarshalAs] attributs. Mais puisque vous avez déjà fait cela, le reste devrait être facile.

Je vous suggère de changer votre prototype d'usine de

IUnknown * GetFactory(); 

à

HRESULT GetFactory([out] IUnknown ** ppunk); 

Il semble y avoir une hypothèse forte par le code COM iterop que toutes les méthodes COM retour HRESULT et il sera être plus simple d'obtenir le marshalling pour travailler si vous allez avec le flux là-bas.

+0

Génial! Je n'avais pas réalisé que l'interopérabilité COM était implémentée en termes des mêmes types de marshalling P/Invoke. Ça aurait dû être évident. Merci. – Armentage

+0

Ok, tout cela fonctionne pour les situations où vous avez une DLL spécifique que vous allez invoquer; Cependant, que se passe-t-il si vous voulez appeler une DLL lors de l'exécution? – Armentage

+0

@Armentage: Je vous suggère de faire une nouvelle question, je ne connais pas la réponse à cette question sur le dessus de ma tête, mais je parie que quelqu'un ici fait. –

Questions connexes