Je convertis un ancien objet COM VB (que je n'ai pas écrit) en C++ en utilisant ATL. L'une des méthodes, selon l'IDL, prend un IDispatch*
comme paramètre et la documentation et les échantillons pour cette méthode prétendent que vous pouvez passer soit une chaîne (qui est le progid d'un objet qui sera créé et utilisé par le contrôle) ou un IDispatch*
à un objet qui a déjà été créé. Comment diable puis-je implémenter ceci dans ATL?Convertir IDispatch * en chaîne?
Par exemple, l'IDL:
[id(1)] HRESULT Test(IDispatch* obj);
Les échantillons (qui sont tous JScript):
obj.Test("foo.bar");
ou
var someObject = new ActiveXObject("foo.bar");
obj.Test(someObject);
Pour rendre les choses encore plus bizarre la VB réelle Le code qui implémente cette méthode déclare en fait le paramètre 'obj' comme une chaîne! Cependant, tout semble fonctionner.
Pouvez-vous même passer une chaîne à une méthode COM qui prend un IDispatch*
? Si oui, puis-je déterminer que le IDispatch*
est réellement une chaîne dans mon code ATL C++? Mieux encore, si c'est un IDispatch
qui implémente une interface spécifique, je voudrais appeler des méthodes, ou instancier un objet s'il s'agit d'une chaîne.
Toutes les idées sont les bienvenues!
Pourquoi ne pas utiliser une variante? –
Juste pour être sûr. Le code vb a une méthode prenant un argument de chaîne mais quand vous extrayez l'IDL du .dll il semble que les méthodes prennent un IDispatch à la place? –
@Alexandre - oui, l'IDL (qui a été fourni avec la source VB - je ne l'ai pas extrait) montre la méthode en prenant un IDispatch * mais le code VB lui-même déclare le param comme une chaîne. Les exemples JScript utilisent à la fois une chaîne et une interface comme décrit. – Rob