2009-08-06 14 views
2

Je travaille avec un objet COM tiers dont certains de ses méthodes transmettent des valeurs en tant que pointeur BSTR. Étant donné que VBscript ne prend en charge que les tentatives de type Variant à utiliser d'une manière similaire à Object.Method (sMyString), se termine raisonnablement avec une erreur de type "incompatibilité de type".Problème de "type incompatibilité" VBScript avec le paramètre "[in, out] BSTR *"

Je suppose que cette erreur est générée par l'objet COM lui-même plutôt que par l'interpréteur VBScript puisque l'objet reçoit une chaîne à la place du pointeur. J'ai essayé de contourner le problème en définissant le tableau de chaînes mais c'est toujours la même erreur.

Alors je me demandais si quelqu'un avait un problème similaire et quelles étaient les solutions de contournement utilisées.

Juste pour souligner. Je n'ai pas de contrôle sur l'objet COM. C'est dans l'application du vendeur. Je dois l'utiliser "tel quel".

Merci, Albert Gareev

Répondre

0

Après examen de la solution de contournement de wrapper, j'ai trouvé que l'utilisation de l'objet COM Automation existant présente certains avantages par rapport au développement de votre propre API.

Étant donné que j'utilise déjà l'objet Excel.Application à d'autres fins, je viens de créer quelques macros dans VBA et de les exécuter si nécessaire.

Plus de détails dans mon blog:

http://automation-beyond.com/2009/09/21/gp-qtp-automation-sanscript/

http://automation-beyond.com/2009/09/23/gp-automation-vbscript-limitation/

Merci, Albert Gareev

6

Les règles pour les types que VBScript est autorisé à utiliser un peu limité par rapport à d'autres langues. Dans votre cas, vous avez [in, out] BSTR * - ceci n'est pas supporté. Le seul type autorisé pour un paramètre [out] est VARIANT *. VBScript exigerait que le type soit [out, retval] afin de prendre en charge le type BSTR dans cette position. Bien sûr, vous ne pouvez avoir qu'un [retval] par fonction, ce qui est quelque peu limitant.

Dans tous les cas dans votre situation, vous êtes en quelque sorte bloqué car vous ne pouvez pas modifier le code du serveur. Ce que je ferais est d'écrire un wrapper COM dans C++ qui encapsule l'API dans quelque chose que vous pouvez appeler. L'encapsuleur COM peut changer le [out] BSTR * en un [out] VARIANT * ou autre chose qui est utilisable.