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
A voir également:
Passage d'un tableau de string d'une DLL standard à VB
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 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
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 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
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 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
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 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
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
cs_andrebernard
Messages postés404Date d'inscriptionlundi 9 juin 2003StatutMembreDernière intervention 4 septembre 20131 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 :