Différence de fonctionnement DLL avec VB6 et VB.NET
Opiumm
Messages postés5Date d'inscriptiondimanche 29 juin 2003StatutMembreDernière intervention 8 janvier 2007
-
7 janv. 2007 à 19:44
ShareVB
Messages postés2676Date d'inscriptionvendredi 28 juin 2002StatutMembreDernière intervention13 janvier 2016
-
12 janv. 2007 à 22:15
Bonjour à tous (et bonne année),
Je suis coincé sur l'utilisation d'une DLL externe provenant d'un fabriquant.
J'utilise un form avec un bouton d'action (pour mes tests).
VB6: Voici mon code principal dans le form:
Private Sub Command1_Click()
Initialise
Dim lines As Integer
SetParams True, True, False, False
lines = Encode("(01)24012345678900(17)071201(10)Test321")
MsgBox ("lines: " & lines)
MsgBox ("code: " & GetNextLine)
Free
End Sub
Initialise est une fonction permettant l'allocation d'un espace mémoire pour le traitement de la variable string de la fonction Encode.
SetParams permet de modifier les modes d'encodage de la variable de type string
Encode renvoi le nombre de lignes
GetNextLine permet de retourner ligne par ligne (à chaque fois qu'on l'appelle) la variable de type string sous forme codée.
Je crée également un module où je déclare les fonctions utilisées dans mon form:
Public Declare Sub Initialise Lib "RSSDLL.dll" ()
Public Declare Sub Free Lib "RSSDLL.dll" ()
Public Declare Sub SetParams Lib "RSSDLL.dll" (ByVal stacked As Boolean, ByVal linked As Boolean, _
ByVal negative As Boolean, ByVal sequence As Boolean)
Public Declare Function Encode Lib "RSSDLL.dll" (ByVal chars As String) As Integer
Public Declare Function GetNextLine Lib "RSSDLL.dll" () As String
Le problème est que cela ne fonctionne pas sous VB6 et bien sous Visual Studio 2005 avec le code suivant (qui est exactement le même que celui ci sauf qu'il est à la sauce visual basic 2005:
Visual Basic 2005:
Form:
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Initialise()
Dim lines As Integer
SetParams(True, True, False, False)
lines = Encode("(01)24012345678900(17)071201(10)Test321")
MsgBox("lines: " & lines)
MsgBox("code: " & GetNextLine)
Free()
End Sub
End Class
Et ceci dans le module:
Module Module1
Public Declare Sub Initialise Lib "RSSDLL.dll" ()
Public Declare Sub Free Lib "RSSDLL.dll" ()
Public Declare Sub SetParams Lib "RSSDLL.dll" (ByVal stacked As Boolean, ByVal linked As Boolean, _
ByVal negative As Boolean, ByVal sequence As Boolean)
Public Declare Function IsSequence Lib "RSSDLL.dll" () As Boolean
Public Declare Function Encode Lib "RSSDLL.dll" (ByVal chars As String) As Integer
Public Declare Function GetNextLine Lib "RSSDLL.dll" () As String
End Module
Mon problème:
Concrètement, les résultats donnés par Encode sont différents suivant que j'utilise VB6 ou Visual studio 2005
VB6: lines=13
GetNextLine = ""
Visual Studio 2005: lines=14
GetNextLine="Q(t(CLiwk*rnlQwq)"
Visual Studio 2005 renvoi les données attendues et correctes.
Je n'arrive pas à comprendre pourquoi cela diffère entre les 2 compilateurs...
Dans mon application, je dois absolument travailler en VB6.
Tout en essayant de trouver une solution, j'attends avec impatience que l'on m'éclaire
Merci
A voir également:
Différence de fonctionnement DLL avec VB6 et VB.NET
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 7 janv. 2007 à 20:09
Salut,
dans la déclaration de tes APIs, pour VB6, change tous les type Integer en type Long.
Il me semble que c'est ça car tous les utilisateurs de vb 2005 doivent changer les Long en Integer.
@++
<hr size="2" width="100%" />
--Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
<!--
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 7 janv. 2007 à 21:24
C'est plutot bizarre en effet...
Tu veux pas m'envoyer ta dll sur julienjemine(at)yahoo.fr ? Je vais essayer...
Sinon, l'endroit pouvant poser problème c'est le passage de ta chaine de caractères dans Encode... (La dll ne va pas renvoyer deux choses différentes avec les même entrées)
Mais pourquoi ?
La seule chose qui me vient à l'esprit serait que les caractères seraient codés sur un différent nombre d'octet dans les deux langages... mais je sais pas...
Opiumm
Messages postés5Date d'inscriptiondimanche 29 juin 2003StatutMembreDernière intervention 8 janvier 2007 7 janv. 2007 à 21:49
Hello,
Je t'ai envoyé la dll par email... je me suis dit aussi qu'il
s'agissait d'un problème de transfert de chaîne...
J'ai essayé avec les
conversions UNICODE -> ANSI etc, mais rien n'y fit...
Je vous remercie
pour l'intérêt que vous portez à mon problème.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 7 janv. 2007 à 21:50
faut peut-etre faire du marshaling sur les strings, c'est possible.
Reste aussi le type boolean, qui est codé je crois sur un integer en VB6, mais je ne sais pas du tout sur quoi il est codé en .net, integer peut-etre aussi mais correspond à un long en VB6 alors.
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 8 janv. 2007 à 10:35
Mince, je suis désolé je sèche complètement...
Seul tache de lumière dans mes essais :
Lorsque je déclare tous les booleans en Long dans VB6 et que je mets 1 et 0 à la place de True et False, j'obtiens 14 lignes, mais pas de GetNextLine...
As-tu accès aux sources de la dll ?
Sinon au pire du pire, tu peux toujours faire une dll de transition en VB2005 et tu y accède par vb6... Mais bon, c'est quand même pas top comme solution...
__________________________
Julien.
Opiumm
Messages postés5Date d'inscriptiondimanche 29 juin 2003StatutMembreDernière intervention 8 janvier 2007 8 janv. 2007 à 19:18
Bonsoir Julien,
Merci pour l'info au niveau des boolean, on avance :)
J'avais penser créer une dll de transition, malheureusement je ne parviens pas à créer une dll en vb2005 qui fonctionne...
J'ai un problème d'entry point... si quelqu'un pouvais éventuellement me donner un code source de base permettant la création d'une dll en vb2005...ou un tutoriel valable je lui serais vraiment très reconnaissant...