2010-09-10 5 views
4

Cette question fait suite à une question précédente (here).Appel d'une DLL Visual Basic en C++, partie 2

J'ai acquis une DLL qui a été créée dans Visual Basic à partir d'un fournisseur tiers (Sensor DLL.dll). Cette DLL contient des fonctions pour parler à un capteur, et j'ai besoin d'appeler ces fonctions à partir d'un programme Visual C++ que j'écris. Le fournisseur ne fournira pas un fichier d'en-tête et je ne connais pas Visual Basic.

J'ai une petite quantité de documentation sur chaque fonction. Par exemple, on me dit une fonction (get_data) dans la DLL est de la forme:

Public Function Get_Data(ByVal Handle As String) As String 

qui retournera une chaîne avec une valeur comprise entre -16777216 et +16777215. C'est tout.

Dans l'utilisateur précédent question Hans Passant a donné cette réponse utile:

Une VB6 DLL est normalement un serveur COM. Vous avez en fait l'équivalent d'un fichier .h, il a une bibliothèque de types intégrée. Commencez par partir avec Project + Properties, Common Properties, Framework et Références. Bouton Ajouter une nouvelle référence, onglet Parcourir, sélectionnez la DLL.

Ensuite, View + Object Browser. Vous devriez voir la bibliothèque Interop générée dans la liste. Ouvrez le noeud pour voir ce qu'il y a. Vous écrivez du code managé normal, comme gcnew, pour créer l'objet COM et appeler les méthodes d'interface. Vous avez besoin d'une documentation minimale sur les méthodes disponibles pour avoir une idée de la façon dont ils doivent être appelés.

Suite à ce conseil que j'ai bien vu la liste des fonctions dans la DLL dans l'Explorateur d'objets, y compris Get_Data(System::String) mais je suis confus au sujet de travailler avec des objets COM, ce qui est au-delà de mon expérience.

J'ai essayé simplement d'appeler Get_Data(Handle);Handle est un BSTR maintenant que j'ai ajouté la référence à mon projet, mais il n'a pas été reconnu. J'ai également essayé d'appeler CoInitialize d'abord, mais cela n'a pas aidé.

Quelqu'un peut-il me dire précisément ce que j'ai besoin d'écrire maintenant pour appeler la fonction? Merci!

+0

Si l'original est 'typedef PVOID Handle;', alors vous devriez passer dans 'System.IntPtr'. Au-delà, je peux juste répéter ce que Hans a dit: vous ne fournissez pas assez d'informations pour que nous puissions vous aider. Vous n'avez même pas dit quel est le message d'erreur réel. –

Répondre

1

Si je comprends correctement votre situation, vous avez au moins un objet COM implémenté dans un .dll VB6. Pour utiliser cet objet, vous devez créer une instance de l'objet COM avant d'appeler la méthode GetData. CoInitialize initialisera uniquement le système COM. Vous devez également utiliser une API telle que CoCreateInstance.