2012-01-12 4 views
0

J'ai un projet vb6 dans lequel j'utilise une bibliothèque dll pour effectuer certaines tâches. Pour cela, ajouter un module qui déclare toutes les fonctions de cette bibliothèque, tels que:Problème lors de l'appel de la DLL native VB6 à partir de VB.net Project

Declare Function myFunction Lib "abcdapi.dll" (ByVal hVar1 As Long, ByVal hVar2 As Long) As Long 

Quand j'appelle cette fonction (et beaucoup d'autres semblables), je suis en mesure de faire le travail et correct pointeur Long est retourné. Mais quand j'essaie de faire la même chose avec VB.net (en important la même bibliothèque en utilisant dllimport et en appelant la même fonction), je n'obtiens aucun résultat. bien qu'il renvoie un pointeur mais cela ne produit pas un résultat correct.

Private Const ABCD As String = "abcdapi.dll" 
<DllImport(ABCD)> 

Public Shared Function myFunction(ByVal hVar1 As IntPtr, ByVal hVar2 As IntPtr) As IntPtr 
End Function 

Lorsque j'essaie d'appeler la fonction ci-dessus, cela ne fonctionne pas. J'ai même essayé de créer une DLL dans mon projet vb6 en utilisant la fonction et essayer d'utiliser le mot-clé imports pour appeler cette nouvelle DLL mais cela ne fonctionne pas non plus. Quel pourrait être le problème et comment puis-je le faire fonctionner.

+0

Pouvez-vous afficher du code qui appelle la fonction? Comment "ça ne marche pas" de vb.net? Erreurs, mauvaises valeurs de retour, c'est quoi? – MarkJ

+0

l'appel de fonction est ci-dessous: – Rahul

+0

l'appel de fonction est ci-dessous: ibOK = TM1ValBoolGet (hUser, voTemp) Dans VB.net:Declare fonction TM1ValBoolGet Lib "tm1api.dll" (ByVal hUser comme long, ByVal vBool As Long) entier En vb.net: fonction publique partagée TM1ValBoolGet (ByVal comme IntPtr Huser, ByVal comme IntPtr vBool) As integer End Function Je n'ai pas de code de cette fonction donc pas sûr de ce se passe dedans mais les détails de la fonction peuvent être vus ici: http://publib.boulder.ibm.com/infocenter/ctm1/v9r5m0/topic/com.ibm.swg.im.cognos.tm1_api.9.5.2.doc /tm1_api_id14631tm1func_tm1valboolget.html – Rahul

Répondre

1

Les docos vous avez fait référence show:

TM1IMPORT TM1_BOOL TM1API TM1ValBoolGet(TM1U hUser, TM1V vBool); 

Est-il possible que TM1U et TM1V sont définis comme 32 types de données binaires dans cette API et que vous exécutez votre code .NET sur une machine 64 bits, ce qui rend votre IntPtr un type de données 64 bits? (Si l'API est livrée avec des fichiers d'en-tête C, vous pouvez voir comment ces types de données sont définis). Essayez de recompiler votre code .NET en "x86" et réessayez.

Je viens de copier ce code de votre commentaire ci-dessus:

l'appel de fonction est ci-dessous:

ibOK = TM1ValBoolGet(hUser, voTemp) 

En VB.net: < < < Je suppose ici que vous vouliez dire VB6

Declare Function TM1ValBoolGet Lib "tm1api.dll" (ByVal hUser As Long, ByVal vBool As Long) As Integer 

En vb.net:

<DllImport(TM1APIDLL)> Public Shared Function TM1ValBoolGet(ByVal hUser As IntPtr, ByVal vBool As IntPtr) As Integer 
End Function 

Il est probablement une faute de frappe, mais ce type de retour dans votre VB6 n'est pas le même que celui de VB.NET. Un entier VB6 est 16 bits et un entier dans VB.NET est 32 bits.

+0

Je compile mon code pour l'environnement x86 seulement et j'ai une machine 32 bits. Que TM1U et TM1V sont définis parce que le site Web explique la fonction en référence avec C. Mais vous pouvez jeter un oeil comment la fonction est déclarée dans l'encapsuleur VB Api. (comme indiqué ci-dessus) Des idées? – Rahul

+0

Je vois vos déclarations. Le type de données VB6 Long est toujours 32 bits, quoi qu'il arrive. Mais le type de données IntPtr est 32 bits sur x86 et 64 bits sur x64, d'où ma suggestion d'une raison pour laquelle cela ne fonctionne pas dans .NET. Compiler pour x86 devrait empêcher cela, donc pas probable. – tcarvin

+0

@Rahul J'ai édité un peu plus pour que vous puissiez regarder – tcarvin

Questions connexes