Différence de fonctionnement DLL avec VB6 et VB.NET

Opiumm Messages postés 5 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 8 janvier 2007 - 7 janv. 2007 à 19:44
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 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

9 réponses

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
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"
<!--
0
Opiumm Messages postés 5 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 8 janvier 2007
7 janv. 2007 à 20:18
Merci pour ta réponse,

Je viens d'essayer et , hélas, cela ne solutionne pas le problème...
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
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...

Julien.
0
Opiumm Messages postés 5 Date d'inscription dimanche 29 juin 2003 Statut Membre Derniè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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0
Opiumm Messages postés 5 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 8 janvier 2007
7 janv. 2007 à 22:18
Etant vraiment novice sur le marshaling etc, je met a disposition les codes avec la dll...
Je continue mes recherches...http://rapidshare.com/files/10702650/Testdll.rar.html
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
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.
0
Opiumm Messages postés 5 Date d'inscription dimanche 29 juin 2003 Statut Membre Derniè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...

Merci
0
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
12 janv. 2007 à 22:15
salut,
-> en VB6 : True -1, False 0
-> il va te falloir passer par une TLB...

http://www.sharevb.net/-VB-.html

ShareVB
0
Rejoignez-nous