Passage d'un tableau de string d'une DLL standard à VB

cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 - 16 oct. 2008 à 17:38
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 - 17 oct. 2008 à 16:37
Bonjour a tous


Je cherche à recuperer un tableau de string créé dans une DLL standard dans VB


J'ai essayé avec ce code, que j'utilise habituellement pour recuperer les variables strings, mais j'obtiens des carrés et des hieroglyphe.


Dans ma DLL  "c:\EssaiTablo.dll", j'ai juste une simple procedure LeTablo qui renvois l'adresse d'un tableau de 4 lignes.

Du style :

Tablo(0) = "Programming"
Tablo(1) = "is "
Tablo(2) = "your"
Tablo(3) = "friend"


Voici le code VB



Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString1 As Any) As Long
Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Any) As Long
Private Declare Function LeTablo Lib "c:\EssaiTablo.dll" () As Long



Public Function StringDLL(Variable)
 Dim RetourAdresse As Long, RetourDll As String
 RetourAdresse = Variable
 RetourDll = Space$(lstrlen(RetourAdresse))
 lstrcpy RetourDll, RetourAdresse
 StringDLL = RetourDll
End Function



Private Sub Form_Load()
 EssaihWnd = LoadLibrary("c:\EssaiTablo.dll")
 MsgBox StringDLL(LeTablo())
 FreeLibrary (EssaihWnd)
End Sub


Merci de votre aide
Bonne journée

12 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 oct. 2008 à 17:48
salut,

déjà que les tableaux sont souvent un calvaire pour VB alors si en plus tu ne déclares ni ne types quoi que ce soit, çà risque de poser problème en effet

regarde tout çà de près :


EssaihWnd (ni déclaré ni typé, long attendu),
LeTablo() (pas déclaré donc pas typé, string() attendu. à moins que çà soit ta fonction? çà porte à confusion...),
StringDLL (pas typée, est sensé retourner quoi? si c'est un tableau tu ne pourra pas l'afficher en msgbox),
Variable (mot clé réservé, et pas typé), etc....


bref tout ^^
commence par ajouter "option explicit" en première ligne de code pour forcer l'erreur d'absence de déclaration
++

<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
16 oct. 2008 à 18:05
Merci de ta reponse PCPT
Je vais faire comme tu as dis
J'avais une erreur dans ma DLL.
J'arrive maintenant a retourner le premier mot, mais il doit y avoir un espece de chr(13) ou chr(0) qui m'empeche de voir le reste
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
16 oct. 2008 à 18:18
Bon...j'ai fais comme tu as dit, et rien de mieux
Je n'ai pas su comment déclarer LeTablo qui est bien la fonction de ma Dll
J'ai toujours que le premier mot qui remonte.

Option Explicit
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString1 As Any) As Long
Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Any) As Long
Private Declare Function LeTablo Lib "c:\EssaiTablo.dll" () As Long



Public Function StringDLL(Var As Long) As String
 Dim RetourAdresse As Long, RetourDll As String
 RetourAdresse = Var
 RetourDll = Space$(lstrlen(RetourAdresse))
 lstrcpy RetourDll, RetourAdresse
 StringDLL = RetourDll
End Function



Private Sub Form_Load()
 Dim EssaihWnd As Long, RetourDll As Long
 EssaihWnd = LoadLibrary("c:\EssaiTablo.dll")
 RetourDll = LeTablo
 Debug.Print StringDLL(RetourDll)
 FreeLibrary (EssaihWnd)
End Sub
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 oct. 2008 à 18:58
re,

mais cette dll est sensée renvoyer un tableau en fonction de quelquechose non?
si c'est fixe alors c'est toujours le même (ah bon? ^^), donc c'est juste un tableau que tu peux remplir seul, sans dll....

y'a une problème sur l'utilité....

ensuite si tu peux déclarer "
Declare Function LeTablo Lib "c:\EssaiTablo.dll" () As Long
", alors pourquoi tu passes en plus par
LoadLibrary
et
FreeLibrary
?

enfin, tu passes par
lstrcpy
, qui copie une chaine..., pas un tableau. il faudrait utiliser VarPtr et CopyMemory dans ton cas
ce qui ne change rien au fait que.... tel quel je ne vois pas l'intérêt de ta dll

ps :
Var
est aussi réservé ^^

<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0

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

Posez votre question
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
16 oct. 2008 à 23:27
mais cette dll est sensée renvoyer un tableau en fonction de quelquechose non?
si c'est fixe alors c'est toujours le même (ah bon? ^^), donc c'est juste un tableau que tu peux remplir seul, sans dll....
y'a une problème sur l'utilité....

Non c'est un exemple pour simplifier, c'est deja bien assez compliqué pour moi comme ça.
En fait ma DLL va lire un fichier crypté, le decrypte et l'affiche dans un panneau skinné, mais j'aimerais pouvoir récuperer le tableau affiché par la DLL

ensuite si tu peux déclarer " Declare Function LeTablo Lib "c:\EssaiTablo.dll" () As Long ", alors pourquoi tu passes en plus par LoadLibrary et FreeLibrary ?
Ca c'est une combine de RENFIELD pour recuperer le handle de la DLL, et surtout pour eviter l'erreur si elle n'est pas "chargeable".
Dans ma DLL j'ai un code qui renvoi le pointeur a l'entrée, en cas de probleme d'autorisation, cette fonction est faite en ASM, je n'y connais rien mais ça marche.
Le bleme c'est que ça marche tellement bien que VB est leurré et crois qu'elle n'existe pas, alors qu'il l'a bien ouverte et s'est fait "ejecté".
Donc si le handle est a zero, je passe, et pas de message d'erreur de VB

enfin, tu passes par lstrcpy , qui copie une chaine..., pas un tableau. il faudrait utiliser VarPtr et CopyMemory dans ton cas
ce qui ne change rien au fait que.... tel quel je ne vois pas l'intérêt de ta dll
Bon pour l'utilité de la DLL c'est fait, je crois
Merci pour le conseil Varptr, j'essaierais ça, j'espere que ça va marcher et retourner mon tableau

Je te souhaite une bonne nuit et encore merci de ta patience
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 oct. 2008 à 14:12
Faudrait d'abord être certain que cette DLL a été écrite pour VB, un tableau de 'String' est un truc très spécifique au VB.
On peut tout à fait le générer en C mais si ce n'est pas spécifié dans le cahier des charges, peu de chances que la DLL perde du temps à faire cela.

Essaie de vérifier que ta DLL ne retourne pas un truc du genre:
"String1  \0String2   \0String3   \0\0"
C'est ainsi qu'on simule les tableaux de chaines en C, ce qu'on retrouve dans la BDR et ailleurs.

ciao...
BruNews, MVP VC++
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
17 oct. 2008 à 14:44
Bonjour BRUNEWS et merci de te pencher sur mon berceau de bébé programmeur

Essaie de vérifier que ta DLL ne retourne pas un truc du genre:
"String1  \0String2   \0String3   \0\0"
C'est ainsi qu'on simule les tableaux de chaines en C, ce qu'on retrouve dans la BDR et ailleurs.

Bah le probleme c'est que je sais pas comment faire ???
Puisque tout ce que j'arrive a retourner c'est le premier mot.

Si tu as quelques minutes, voici le lien de ma DLL
Comme je l'ai dit, il y a qu'un tableau dimensionné a 4 lignes
Et le retour de l'adresse de son premier element :
http://erdsjb.free.fr/EssaiTablo.dll

Bon j'ai cherché a faire ce que m'a conseillé PCPT et evidemment ça marche pas.



Option Explicit
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
'Private Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString1 As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RTlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cbCopy As Long)
Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Any) As Long
Private Declare Function LeTablo Lib "c:\EssaiTablo.dll" () As Long



Public Function StringDLL(AdrMem As Long) As String
 Dim RetourAdresse As Long, RetourDll As String, a As Long
 RetourAdresse = AdrMem
 RetourDll = Space$(lstrlen(RetourAdresse))
 CopyMemory a, RetourAdresse, 100
 RetourDll = VarPtr(a)
 StringDLL = RetourDll
End Function



Private Sub Form_Load()
 Dim EssaihWnd As Long, RetourDll As Long
 EssaihWnd = LoadLibrary("c:\EssaiTablo.dll")
 RetourDll = LeTablo
 Debug.Print StringDLL(RetourDll)
 FreeLibrary (EssaihWnd)
End Sub
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 oct. 2008 à 15:05
Faut regarder le code de la DLL, il n'y a que ça.
Tu peux être quasi certain que j'ai identifié le prob.

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 oct. 2008 à 15:19
C'est quoi cette daube de DLL ?
Elle est liée en statique à msvcrt.dll (à ne jazmais faire) pour 2 petites fonctions stupides qui pouvaient s'écrire en qlqs secondes.
D'autre part elle n'utilise du system que les fonctions standards d'alloc et pas du tout celles générant des tableaux de BSTR, m'étonnerait fort que l'auteur de la DLL ait tout recodé en interne donc pas de String au sens VB du terme à attendre.

ciao...
BruNews, MVP VC++
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
17 oct. 2008 à 16:19
Elle est liée en statique à msvcrt.dll
Elle n'est pas faite en C, mais par un programme qui simplifie tout, pour les benets comme moi :- )


Ce qui est sur, c'est que le tableau est declaré en static, c'est peut etre ce que tu veux dire
Encore une fois, c'est juste un exemple d'essai, si tu pouvais trouver la combine pour la faire marcher apres je ferais exactement ce que tu as trouvé pour ma grosse DLL, qui elle est assez complexe.(Enfin pour moi evidemment)
Voici le code 6 lignes :


ProcedureDLL LeTablo()
 Static  Dim Tablo.s(4)
 Tablo(0) = "Programming"
 Tablo(1) = "is "
 Tablo(2) = "your"
 Tablo(3) = "friend"
 ProcedureReturn @Tablo(0)
EndProcedure

Tu vois plus simple tu meurs, donc c'est fait pour moi ;- )
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 oct. 2008 à 16:29
ouh la....
Moi je code, la bouillie scriptologique au dessus, je n'y entends strictement rien.

ciao...
BruNews, MVP VC++
0
cs_andrebernard Messages postés 404 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 4 septembre 2013 1
17 oct. 2008 à 16:37
Bon ben tanpis pour moi.
Merci quand meme de ton aide
Bonne journée
0
Rejoignez-nous