Page 2 sur 2
Publié : ven. 17/oct./2008 17:22
par Kwai chang caine
Merci ERIX, tu ne me connais pas bien mais moi j'comprend vite, mais faut m'expliquer drolement longtemps
Bon, je vais donc essayer, au debut, j'avais pas mis le zero, et ça me retournait des hieroglyphe et des carrés
Je vais reessayer.

Publié : ven. 17/oct./2008 17:25
par Kwai chang caine
Mon bon ERIX, c'est bien ce que je crainiais
J'ai fait comme t'as dit, j'ai mis ton code de DLL et le code VB que j'ai mis juste au dessus, et voila ce qu'a fait de mon beau tableau tout neuf, ce language de m.....
Publié : ven. 17/oct./2008 17:34
par Anonyme2
ta boucle c'est normal qu'elle retourne 4 fois la même chose, l'adresse ne change pas.
J'ai regardé ton code et essaye ceci
Modifie ta Dll pour qu'elle retourne l'adresse de l'élément du tableau voulue, donc la Dll accepte un paramètre
Code : Tout sélectionner
Macro Ubound(Array)
; Rings sur le forum anglais
; http://www.purebasic.fr/english/viewtopic.php?t=8267
(PeekL(Array-8))
EndMacro
ProcedureDLL.l LeTablo(element.l)
Dim Tablo.s(3) ; 3 = 4 éléments
Tablo(0) = "Pure"
Tablo(1) = "is "
Tablo(2) = "your"
Tablo(3) = "friend"
; on controle que la valeur n'est pas supérieure à la valeur max
If element<0 Or element> = Ubound(Tablo())
ProcedureReturn -1
Else
ProcedureReturn @Tablo(element)
EndIf
EndProcedure
essaye la boucle
n'oublie pas de tester la valeur -1 si nécessaire
Publié : ven. 17/oct./2008 17:42
par Kwai chang caine
Merci DENIS
Bah cette fois j'ai aucun resultat, meme plus mes hieroglyphes
Voila les codes, pour etre bien sur de ce que j'ai essayé:
Code : Tout sélectionner
Macro Ubound(Array)
; Rings sur le forum anglais
; http://www.purebasic.fr/english/viewtopic.php?t=8267
(PeekL(Array-8))
EndMacro
ProcedureDLL.l LeTablo(element.l)
Dim Tablo.s(3) ; 3 = 4 éléments
Tablo(0) = "Pure"
Tablo(1) = "is "
Tablo(2) = "your"
Tablo(3) = "friend"
; on controle que la valeur n'est pas supérieure à la valeur max
If element<0 Or element> = Ubound(Tablo())
ProcedureReturn -1
Else
ProcedureReturn @Tablo(element)
EndIf
EndProcedure
Code : Tout sélectionner
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()
Dim EssaihWnd As Long, RetourDll As Long
EssaihWnd = LoadLibrary("c:\EssaiTablo.dll")
For i = 0 To 3
Debug.Print StringDLL(i)
Next
FreeLibrary (EssaihWnd)
End Sub
Publié : ven. 17/oct./2008 17:44
par Kwai chang caine
Sur le forum VB, j'avais eu cette reponse.
Moi j'y ai rien compris (Comme dab).
Je pense que c'est du coté de VB que ça merde
enfin, tu passes par lstrcpy , qui copie une chaine..., pas un tableau. il faudrait utiliser VarPtr et CopyMemory dans ton cas
Publié : ven. 17/oct./2008 17:53
par Anonyme2
Je n'ai pas VB, je vais essayer avec VBA sous excel (ca marchait bien sous PB)
oublies Varptr car tu cherches à récupérer une chaine et tu scrutes pour les voir toutes. De plus, je ne sais pas si les tableaux VB MS sont gérés comme ceux de PB, alors prudence, d'autant que les indices sous VB peuvent commencer à 0 ou 1.
Publié : ven. 17/oct./2008 18:02
par Kwai chang caine
(ca marchait bien sous PB)
C'est la faute a FRED
Quelle idée de faire un language qui marche tout le temps, qui change presque pas de VB, sauf la couleur et encore on peut la changer.
On comprend plus apres pourquoi, les autres languages ne sont pas comme lui.
Je n'ai pas VB, je vais essayer avec VBA sous excel
Oui super idée, avec VBA ça devrait marcher pour les essais.
Si ça marche avec VBA c'est encore plus sur, parce que VBA c'est encore plus pourri que VB

alors c'est peu dire
De plus, je ne sais pas si les tableaux VB MS sont gérés comme ceux de PB
Surement pas, si c'est simple et sur, alors bilou il aime pas
Regarde meme ce qu'en disent les pros du pot
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
Publié : ven. 17/oct./2008 18:23
par Anonyme2
J'ai modifié ton code VB et ca marche sous VBA
J'ai relu la doc PB sur les Dll et il est dit en anglais (dommage c'est pas traduit) que :
Note about returning strings from DLL's:
If you want to return a string out of a DLL, the string has to be declared as Global before using it.
ce qui veut dire que la variable doit être globale
Voilà le code PB
Code : Tout sélectionner
Macro Ubound(Array)
; Rings sur le forum anglais
; http://www.purebasic.fr/english/viewtopic.php?t=8267
(PeekL(Array-8))
EndMacro
ProcedureDLL.l LeTablo(element.l)
Global Dim Tablo.s(3) ; 3 = 4 éléments
; on controle que la valeur n'est pas supérieure à la valeur max
Tablo(0) = "Pure"
Tablo(1) = "is "
Tablo(2) = "your"
Tablo(3) = "friend"
If element<0 Or element> = Ubound(Tablo())
ProcedureReturn -1
Else
ProcedureReturn @Tablo(element)
EndIf
EndProcedure
et le code VB (regardes j'ai modifié la fonction Letablo pour qu'elle accepte le paramètre d'entrée)
Code : Tout sélectionner
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" (ByVal element As Long) 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()
Dim EssaihWnd As Long, RetourDll As Long
For i = 0 To 4
Debug.Print StringDLL(LeTablo(i))
Next
FreeLibrary (EssaihWnd)
End Sub
Publié : ven. 17/oct./2008 18:46
par Kwai chang caine
DENIS je t'aime !!!!!
C'etait "juste" ça
Un petit global qui me traumatise depuis 2 jours
Dix milles merci
Ca fait du bien de savoir que quand on est vraiment dans la "oumpha" on a des copains qui sont la, .... tapi dans l'ombre pres a bondir pour sauver la vierge et l'orphelin (Moi c'est l'orphelin, hein !!!!

)
J'etais désespéré, et ces CAIDS du forum VB qui ont le chic de rendre tout compliqué, alors que notre FREDO, il a tout fait pour que des burnes comme moi, puisse jouer presque dans la meme cour que vous (les vrais).
Allez encore un petit dernier
Merci DENIS
Et aussi merci à tout ceux qui m'ont aidé dans ce POST.
J'en ai presque la larme à l'oeil.
Je vous souhaite une excelente soirée
Et que les dieux vous preservent, ainsi que PURE et son equipe

Publié : ven. 17/oct./2008 19:26
par Anonyme2
Sinon une petite erreur c'est la boucle for i = 0 to 4, c'est to 3
le 4 c'était pour mes tests
Publié : ven. 17/oct./2008 19:34
par comtois
avec la 4.30 tu peux te passer de cette macro
Code : Tout sélectionner
Macro Ubound(Array)
; Rings sur le forum anglais
; http://www.purebasic.fr/english/viewtopic.php?t=8267
(PeekL(Array-8))
EndMacro
Tu peux utiliser ArraySize().
C'est balot , la valeur retournée est fausse, il faut ajouter +1.
Code : Tout sélectionner
Dim toto(45)
Macro Ubound(Array)
; Rings sur le forum anglais
; http://www.purebasic.fr/english/viewtopic.php?t=8267
(PeekL(Array-8))
EndMacro
Debug Ubound(toto())
Debug ArraySize(toto())+1
Publié : ven. 17/oct./2008 19:43
par Anonyme2
comtois a écrit :avec la 4.30 tu peux te passer de cette macro
Tu peux utiliser ArraySize().
C'est balot , la valeur retournée est fausse, il faut ajouter +1.
c'est pour ça que je préfère Ubound(Array) qui est à mon sens la vraie dimension, mais je ne polémique pas la-dessus, Arraysize est bien dans certains cas
Publié : ven. 17/oct./2008 19:45
par Kwai chang caine
@DENIS
Merci
@COMTOIS
Impecable, plus c'est simple et mieux ça me va
Deja qu'au dessus de 3 lignes je panique
Merci à toi aussi