PASSER UNE CHAINE A UNE DLL [Résolu]

Signaler
Messages postés
86
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
10 décembre 2006
-
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
-
Bonjour,

J'ai créé en VB6 une dll qui contient une fonction publique dont l'entête est la suivante :

Public Function Tornado(ByVal Uri As String, ByVal DestPath As String, Optional UriReBuilder As Boolean) As Boolean

Je déclare ma dll dans un autre projet VB6 :

Public Declare Function Tornado Lib "Tornado.dll" (ByVal Uri As String, ByVal DestPath As String, Optional UriReBuilder As Boolean) As Boolean

Mais lorsque la dll recoit la chaine de caractère Uri, il y a des ?????????????????????? dedans alors que je met bien une chaine correcte.

J'ai l'impression qu'il y a un problème de passage de paramètre par valeur ou référence (byval/byref) mais je n'arrive pas à régler le pb.

10 réponses

Messages postés
86
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
10 décembre 2006

Bonjour,

bon j'ai trouvé merci pour tout.

il faut passer la chaine de cette manière :
rtr = Tornado(StrConv(Url, vbUnicode), App.Path, False)
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
99
heu, une dll crée en vb6 n'est pas une "vraie" dll, il s'agit d'un activeX, donc il faut référence la dll, et l'utiliser par une instance de classe ! (pas de fonction Declare donc)
Messages postés
86
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
10 décembre 2006

Bonjour,

Alors j'ai une petite parade pour ce problème, j'ai remplacé mon LINK.EXE par un proxylinker qui transmet des paramètres supplémentaires lors de la compilation.

Ce qui fait que j'ai un fichier .def, et que le nouveau LINK.EXE fait appel au vrai LINK.EXE avec en +:
/DEF:"E:\.....\.....\....\Tornado.def" /DLL

En tout cas, cela marche très très bien, et je ne pense pas que cela soit à l'origine du pb car ce n'est pas la première dll que je compile.

Cela évite en tout cas, d'avoir à ajouter en référence le nom de la classe comme tu dis.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
Quel est le code appelant de la fonction, et notamment la valeur de la string juste avant l'appel ?

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
86
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
10 décembre 2006

Bonjour,

voici le code en entier :

Public Function Telecharger()
   
    Dim rtr As Boolean
    Dim Url As String
   
    Url = "http://www.google.fr/intl/fr_fr/images/logo.gif" 'par exemple
   
    rtr = Tornado(Url, App.Path, False)
   
End Function
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
36
Encore faudrait-il savoir ce que attent ta dll comme variable, une chaine, ou un pointeur sur une chaine.

Etant donné que tu utilise une bidouille peu conventionnelle pour créer ta dll, c'est pas évident à savoir.

Essaye de remplacer ByVal Uri par ByRef Uri dans la déclaration de la dll. Peut-etre que ça arrabngera les choses.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
86
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
10 décembre 2006

Bonjour,

la dll attent une string par valeur, je ne souhaite pas modifier le contenu de la chaine mais juste récupérer la valeur :

Public Function Tornado(ByVal Uri As String, ByVal DestPath As String, Optional UriReBuilder As Boolean) As Boolean

Si je fais un msgbox Uri direct ca m'affiche ??????????.

J'ai essayé byref et byval sans succés mais je crois plutot que dans ce cas, c'est ByVal, non ?
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
99
bah quel est l'intérêt d'enlever la réf à la dll vu que celle-ci ne sera chargée que lorsque tu en aura besoin, et surtout, ca évite de l'éviter lors du setup !

Je ne vois vraiment pas comment tu peux appeler une fonction contenue dans une dll activeX avec un declare !

De plus, comment tu obtiens ton fichier .def ??? tu ne confondrais pas vb6 avec vc6 par hasard ???
Messages postés
86
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
10 décembre 2006

Bonjour,

bon voila le lien, ca fait 3 pages :
http://www.windowsdevcenter.com/pub/a/windows/2005/04/26/create_dll.html?page=1

mais peut etre qu'après j'aurais une réponse à mon problème et pas à la manière dont je compile ma DLL ?

C'est bien sur inspiré de VC, car LINK.EXE est le même dans Visual Studio pour VC et VB6.

le fichier .def, à la mano, il fait 5 lignes :
NAME Tornado
LIBRARY ModMain
DESCRIPTION "Tornado Library"
EXPORTS DllMain @1
        Tornado @2

Essaye l'exemple donné sur le site et je pense qu'après tu n'auras peut etre pas la meme vision des DLL créées en VB.

Merci d'avance.
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
99
Et oui, mais là ca change tout à tout : il ne s'agit plus vraiment d'une dll activeX compilée avec VB !

Cela te permet de l'utiliser comme une "vraie" dll, mais j'ai des doûtes quand à l'efficacité de cette méthode comparée à une dll compilée en C !

Enfin bref, tu as réussi à trouver la solution à ton problème, et tant mieux.