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 :
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
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
Partager