Je lance un appel désespéré, car il y a plusieurs jours que je cherche à faire un truc qui parait assez simple au demeurant, mais en fait qui est super dur

Je suis toujours, comme depuis que je code en PB, assis entre deux chaises, enfin plutot entre la banquette VB et le tabouret PB

Pourquoi banquette VB, parce que lourd, gros, hors format, indeplaçable et PB tout le contraire et pourtant permettant de faire la meme chose...s'asseoir au final

Ayant un gros c..... j'arrive d'habitude à poser une fesse sur chaque

Au fil du temps, j'ai donc appris a passer :
1/ Une variable de PB à VB
2/Une variable de VB à PB
3/ Une variable string de PB à VB
4/Une variable string de VB à PB
5/Un tableau de PB à VB
6/Un tableau de VB à PB
7/Un tableau string de PB à VB
Mais VB n'est pas preteur....c'est la le moindre de ses défaut, alors KCC alla querir de l'aide chez VBFRANCE son forum

Il alla aussi quemander ...chez les français qui parlent pas français.
Bien des methodes il obtenu, grace à la générosité des divers membres, mais rien en fait de résolu.
1/ Une methode d'envoi en string de tout le tableau, séparé par un caractere defini, et resplitté dans la DLL PB
Exemple :
a.s(1) = "A"
a.s(2) = "B"
a.s(3) = "C"
String = "A" + chr(0) + "B" + chr(0) + "C"
J'avais trouvé cette methode tout seul....normal c'est la plus tocarde

2/J'ai donc recherché autre chose d'un peu plus "pro"
Une seconde methode m'a été donnée par THEARR en creant un second tableau de pointeur, dans VB et en l'envoyant dans PB.
Reste apres a relire la memoire aux adresses du tableau de pointeur
Partie VB
Code : Tout sélectionner
Private Declare Sub MyFunctionPB Lib "MyDll.dll" (ByRef MyArray As Long)
Public Sub Form_Load()
Dim MyArrayVB(2) As String
Dim MyArrayPB(2) As Long
MyArrayVB(1) = "one"
MyArrayVB(2) = "two"
MyArrayPB(1) = StrPtr(MyArrayVB(1))
MyArrayPB(2) = StrPtr(MyArrayVB(2))
MyFunctionPB MyArrayPB(1) 'Send pointer to PB DLL function (ByRef)
End Sub
Code : Tout sélectionner
ProcedureDLL MyFunctionPB(*ArrayFromVB)
Dim MyArray.l(1)
CopyMemory(*ArrayFromVB, @MyArray(), 2*4)
MessageRequester(PeekS(MyArray(0)), PeekS(MyArray(1)))
EndProcedure

Mais plusieurs problemes se sont profilé dans mon horizon
Deja je ne sais pas pour quelle raison, mais il fallait obligatoirement compiler la DLL en UNICODE

Mais une fois compilé en UNICODE j'avais des phrases mais plusieures se repetait

Et en plus, comme j'envoi en meme temps une string simple alors la cette fois c'est la string qui est en carré

Rings m'a dit que les tableaux VB etait SAFEARRAY....KCC il etait drolement content y connaissait un nouveau mot pour epater ses collegues au boulot

Mais lui non plus y comprenait pas ce que ça voulait dire

Alors apres une valse de VarPtr, StrPtr, ANSI, UNICODE.....j'en passe et des meilleur...et bah KCC il est toujours dans le meme caca

Un gentil membre de VBFRANCE a bien voulu aider KCC.
Je tiens a dire que pour une fois, j'ai eu affaire a quelqu'un d'ouvert qui ne s'est pas barré en courant en entendant le mot PureBasic

Il a fait l'effort de telecharger la version PB demo, mais elle ne fait pas les DLL et les API.
Apres de nombreux essais...il a abandonné et je trouve que deja il avait été super cool

Par contre en dernier ressort.....il m'a donné ce code VB ou il faudrait adapter la procedure VB en procedure PB.
Code : Tout sélectionner
Private Sub Command1_Click()
Dim xs(2) As String
xs(0) = "Ligne 1"
xs(1) = "Ligne 2"
xs(2) = "Ligne 3"
'appel méthode magique simulant la dll PB
CloneStringArray VarPtr(xs(0)), UBound(xs)
End Sub
Code : Tout sélectionner
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any , pSrc As Any , ByVal ByteLen As Long )
'code à adapter en PureBasic....
Sub CloneStringArray(ByVal lhPointer As Long, ByVal lSize As Long)
Dim saNew() As String
ReDim saNew(lSize)
CopyMemory ByVal VarPtr(saNew(0)), ByVal lhPointer, 12
'test
Dim i As Integer
For i = LBound(saNew) To UBound(saNew)
Debug.Print i & ". '" & saNew(i) & "'"
Next i
End Sub

Voila ma vie est entre vos mains

Merci d'avoir lu au moins jusque la
Bonne journée