C++ COM DLL classe héritée
Bonjour,
Voici mon problème.
Je porte une application de Borland C++ vers Visual C++/C#.
Cette application utilise des bibliothèques COM (DLL) écrites en C++ non managé.
Dans ces librairies, j'ai une class d'interface IVehicule qui est virtuelle.
IVehicule est définie comme une classe COM dans la librairie.
J'ai une DLL "Car" qui fournit une classe CCar qui implémente l'interface IVehicule.
J'ai une DLL "Bike" qui fournit une classe CBike qui implémente l'interface IVehicule.
J'ai une DLL "Truck" qui fournit une classe CTruck qui implémente l'interface IVehicule.
Je veux créer un objet COM véhicule (CCar par exemple) en C++.
Comme je dois communiquer avec du code C# (l'IHM), je dois utiliser du C++ managé.
J'utilise donc :
Code:
ObjectHandler ObjH = CreateInstanceFrom(InteropDllName, CCarName)
L'utilisateur choisit le véhicule qu'il veut utiliser. Je détermine InteropDllName et CCarName dynamiquement à partir des informations trouvées dans la base de registre.
Mon problème est de convertir ObjH en IVehicule* pVehicule.
Je pense devoir utiliser
Code:
IVehicule^ mpVehicule = (IVehicule^)(ObjH.UnWrap());
Mais je ne peux pas utiliser IVehicule^ car IVehicule est Virtuel.
En Borland C++ un type TComInterface<IVehicule> était utilisé mais je ne trouve pas d'équivalent sous Visual C++.
J'ai essayé les _com_ptr_t ou CComPtr mais ça ne marche pas car IVehicule est virtuel.
J'ai essayé de créer un objet managé qui implémente IVehicule mais un objet managé ne peut hériter que d'une classe managée (ref class) ou d'une classe interface.
Et IVehicule n'est pas considéré comme une classe d'Interface.
Pourtant ça le devrait...
Une contrainte est de pouvoir ajouter des véhicules sans modifier le programme mais simplement en ajoutant une DLL, son fichier d'interopérabilité et d'ajouter des entrées dans la base de registre. Je ne peux donc pas utiliser dans le code CCar, CBike ou CTruck.
Merci pour toute aide,
zFlorent
C++/CLI,appel à interface com
bonjour,
regarde dans ces 2 articles de la msdn lib help qui donne un exemple d'un wrapper CRCW à ecrire par vos soins.
je cite "Visual C++ peut utiliser directement les objets COM à l'aide des mécanismes COM habituels (tels que CoCreateInstance et QueryInterface). "
1er article:
--------------
Utilisation de serveurs COM natifs à partir du .NET
http://www.google.fr/url?sa=t&source...399fqD3I7azYvw
2eme article :
---------------
Comment : utiliser des serveurs COM natifs avec CRCWs
http://www.google.fr/url?sa=t&source...399fqD3I7azYvw
Il y a bien sur l'utilitaire Type Library Importer (Tlbimp.exe) si la dll a ete compile avec une bibliotheque de type(genere par compilateur Midl).
Tlbimp.exe genere directement un assembly wrapper.
Passer par Tlbimp.exe est le seul moyen pour un utilisateur vb ou c#
Par contre les 2 articles cites ci-dessus sont à l'usage des gens qui ecrivent c++ ou c++/cli et peuvent se passer de la biblitheque de type et de MIDL.
bon code...