Problemes mémoire pr KCC,c'est pas que dans la tete [Résolu]
Publié : jeu. 01/oct./2009 9:29
Bonjour la famille 
Bon... toujours avec mon probleme de discution inter EXE et DLL
KCC il a essayer de bidouiller dans la mémoire comme CPL et SROD, il lui ont dit
Il a pondu un code a dormir dehors avec un ticket de logement
S'il vous plait, j'aimerais vous demander de ne pas essayer de changer la forme..
Car si il est si compliqué, c'est à cause des obligations de ce VB de malheur, et c'est suite a des dizaines d'essais infructueux que j'ai opté pour cette methode assez lourde
Afin que l'appel puisse se faire aussi bien de VB que de PB, et c'est ça qui est le plus dur
Donc, j'aimerais garder cette voie, si ça ne vous dérange pas trop, car elle m'a été conseillée par SROD, à force d'en essayer X qui ne me convenaient pas, ou ne marchaient pas
A moins que vous ayez une en 10 fois moins de lignes et qui fait papa/maman, alors la j'suis preneur
Ou bien si l'on peut simplifier en gardant cette forme
C'est à dire :
Travail de l'EXE
1/ Creation de "ArrayEXE", le tableau que je desire modifier
2/ Envoi de "ArrayEXE" à la DLL par son pointeur
Travail de la DLL
3/ Creation de "ArrayDLL", un nouveau tableau dans la DLL, afin de ne pas croiser les pointeurs DLL/EXE
4/ Copie de "ArrayExe" dans "ArrayDLL" (Rajout de separateurs de champs qui serviront plus tard lors de la mise en mémoire) dans mon cas c'est "|"
5/ Modifier "ArrayDLL" comme je l'entend, c'est le but de tout ce code (Addition et modification des lignes)
6/ Une fois la modif éffectuée, copier "ArrayDLL" dans un bloc memoire
7/ Renvoyer de la DLL le pointeur memoire du bloc
Travail de l'EXE
8/ Recuperer le pointeur du bloc mémoire provenant de la DLL
9/ Lire et splitter le bloc mémoire, et remplir/modifier le tableau "ArrayEXE" d'origine
Voila, je vous l'accorde, c'est pas simple, mais c'est une des methodes pour modifier un tableau d'EXE dans une DLL, sans melanger les pointeurs memoires, et risquer le crash, comme cela m'arrive depuis un mois
Et ce qui est le plus drole, c'est que je crois avoir choisi, la plus simples,
...si evidemment l'on veut, comme moi, se retrouver avec un tableau dans la DLL et pouvoir le travailler comme si c'etait celui de l'EXE, et sans passer par un fichier.
J'ai un probleme a la seconde liberation de la memoire
Et je trouve pas depuis toute la journée d'hier pourquoi....
Je pense que y'a quelque chose sur les mémoires que j'ai encore pas capté
Merci de votre aide et bonne journée

Bon... toujours avec mon probleme de discution inter EXE et DLL

KCC il a essayer de bidouiller dans la mémoire comme CPL et SROD, il lui ont dit

Il a pondu un code a dormir dehors avec un ticket de logement

S'il vous plait, j'aimerais vous demander de ne pas essayer de changer la forme..
Car si il est si compliqué, c'est à cause des obligations de ce VB de malheur, et c'est suite a des dizaines d'essais infructueux que j'ai opté pour cette methode assez lourde

Afin que l'appel puisse se faire aussi bien de VB que de PB, et c'est ça qui est le plus dur

Donc, j'aimerais garder cette voie, si ça ne vous dérange pas trop, car elle m'a été conseillée par SROD, à force d'en essayer X qui ne me convenaient pas, ou ne marchaient pas

A moins que vous ayez une en 10 fois moins de lignes et qui fait papa/maman, alors la j'suis preneur

Ou bien si l'on peut simplifier en gardant cette forme

C'est à dire :
Travail de l'EXE
1/ Creation de "ArrayEXE", le tableau que je desire modifier
2/ Envoi de "ArrayEXE" à la DLL par son pointeur
Travail de la DLL
3/ Creation de "ArrayDLL", un nouveau tableau dans la DLL, afin de ne pas croiser les pointeurs DLL/EXE
4/ Copie de "ArrayExe" dans "ArrayDLL" (Rajout de separateurs de champs qui serviront plus tard lors de la mise en mémoire) dans mon cas c'est "|"
5/ Modifier "ArrayDLL" comme je l'entend, c'est le but de tout ce code (Addition et modification des lignes)
6/ Une fois la modif éffectuée, copier "ArrayDLL" dans un bloc memoire
7/ Renvoyer de la DLL le pointeur memoire du bloc
Travail de l'EXE
8/ Recuperer le pointeur du bloc mémoire provenant de la DLL
9/ Lire et splitter le bloc mémoire, et remplir/modifier le tableau "ArrayEXE" d'origine
Voila, je vous l'accorde, c'est pas simple, mais c'est une des methodes pour modifier un tableau d'EXE dans une DLL, sans melanger les pointeurs memoires, et risquer le crash, comme cela m'arrive depuis un mois

Et ce qui est le plus drole, c'est que je crois avoir choisi, la plus simples,

J'ai un probleme a la seconde liberation de la memoire

Et je trouve pas depuis toute la journée d'hier pourquoi....
Je pense que y'a quelque chose sur les mémoires que j'ai encore pas capté

Code : Tout sélectionner
; This procedure convert the pointer of array from EXE VB/PB to an array in the DLL
Procedure PointerArray2ArrayString(*strPtr.INTEGER, Array Array2Fill.s(1), ArraySize)
Dim Array2Fill(ArraySize)
Array2Fill(0) = Str(ArraySize) + "|" ; Write the lengh of array in line zero
For i = 1 To ArraySize ; Start to 1 for not replace the lengh of array
*strPtr + SizeOf(INTEGER)
Donnee$ = PeekS(*strPtr\i, - 1, #PB_Unicode) + "|"
If Trim(Donnee$) <> ""
Array2Fill(i) = PeekS(*strPtr\i, - 1, #PB_Ascii) + "|"
Else
Array2Fill(i) = Donnee$
EndIf
Next
EndProcedure
; This procedure convert an array string to a block of memory
Procedure ArrayString2PointerMemory(Array Array2Send.s(1))
OffSet = 4
SizeArray2Send = ArraySize(Array2Send())
Array2Send(0) = Trim(Str(SizeArray2Send))
*IdMemory2 = AllocateMemory(SizeArray2Send)
PokeS(*IdMemory2 + Offset, Array2Send(0) + "|")
OffSet + Len(Array2Send(0) + "|")
If *IdMemory2
For i = 1 To SizeArray2Send
PokeS(*IdMemory2 + Offset, Array2Send(i))
OffSet + Len(Array2Send(i))
Next
PokeL(*IdMemory2, Offset)
ProcedureReturn *IdMemory2
Else
ProcedureReturn #False
EndIf
EndProcedure
; This is THE procedure for modify the array
; In this example i want replace the big word "Sentence" by little "Kcc" :-)
; And add two lines
ProcedureDLL ChangeNameAndAddLine(*strPtr.INTEGER, NameToChange.s, NameToReplace.s, ArraySize)
Dim Array2Modify.s(0)
PointerArray2ArrayString(*strPtr.INTEGER, Array2Modify(), ArraySize)
For i = 1 To 5
Array2Modify(i) = ReplaceString(Array2Modify(i), NameToChange, NameToReplace)
Next
OldSizeArray2Modify = ArraySize(Array2Modify())
ReDim Array2Modify(ArraySize(Array2Modify()) + 2)
For i = OldSizeArray2Modify + 1 To ArraySize(Array2Modify())
Array2Modify(i) = "KCC add the line number " + Str(i) + "|"
Next
ProcedureReturn ArrayString2PointerMemory(Array2Modify())
EndProcedure
; This is a procedure for restore the array
; In this example i want replace the word "Kcc" by "Sentence"
; And delete two lines of the end
ProcedureDLL RestoreNameAndDeleteLine(*strPtr.INTEGER, NameToChange.s, NameToReplace.s, ArraySize)
Dim Array2Modify.s(0)
PointerArray2ArrayString(*strPtr.INTEGER, Array2Modify(), ArraySize)
For i = 1 To 5
Array2Modify(i) = ReplaceString(Array2Modify(i), NameToChange, NameToReplace)
Next
ReDim Array2Modify(ArraySize(Array2Modify()) - 2)
ProcedureReturn ArrayString2PointerMemory(Array2Modify())
EndProcedure
; ******************************************************************************************************************
; ******************************************************************************************************************
; ******************************************************************************************************************
; ******************************************************************************************************************
; SEPARATION EXE / DLL
; ******************************************************************************************************************
; ******************************************************************************************************************
; ******************************************************************************************************************
; This procedure convert the block memory to an array
Procedure Memory2Array(*IdMemory, Array ArrayModified.s(1))
SizeMemory = PeekL(*IdMemory)
SizeArray = Val(PeekS(*IdMemory + 4))
Dim ArrayModified.s(SizeArray)
Line = 0
For i = 0 To SizeMemory
Char = PeekB(*IdMemory + 4 + i)
If Char = 124
Line + 1
Continue
EndIf
If Line > SizeArray
Break
EndIf
ArrayModified(Line) + Chr(Char)
Next
FreeMemory(*IdMemory)
EndProcedure
; Create original array
Dim ArrayString.s(10)
For i = 1 To 10
ArrayString(i) = "Sentence " + Str(i)
Next
; Modify the array four time
For o = 1 To 2
*IdMemory = ChangeNameAndAddLine(ArrayString(), "Sentence", "Kcc", ArraySize(ArrayString()))
Memory2Array(*IdMemory, ArrayString())
For i = 0 To ArraySize(ArrayString())
Debug ArrayString(i)
Next
*IdMemory = RestoreNameAndDeleteLine(ArrayString(), "Kcc", "Sentence", ArraySize(ArrayString()))
Memory2Array(*IdMemory, ArrayString())
For i = 0 To ArraySize(ArrayString())
Debug ArrayString(i)
Next
Next