PASSER UNE CHAINE A UNE DLL

Résolu
Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006 - 18 oct. 2006 à 15:33
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 18 oct. 2006 à 18:08
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

Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006
18 oct. 2006 à 17:17
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)
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
18 oct. 2006 à 15:54
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)
0
Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006
18 oct. 2006 à 16:02
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.
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
18 oct. 2006 à 16:37
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 #
0

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

Posez votre question
Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006
18 oct. 2006 à 16:42
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
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
18 oct. 2006 à 16:48
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 #
0
Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006
18 oct. 2006 à 16:55
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 ?
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
18 oct. 2006 à 17:00
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 ???
0
Ulala2 Messages postés 86 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 10 décembre 2006
18 oct. 2006 à 17:08
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.
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
18 oct. 2006 à 18:08
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.
0
Rejoignez-nous