Page 2 sur 2

Publié : jeu. 08/janv./2009 14:13
par Kwai chang caine
Tu es vraiment un ange CLS 8)
Oui oui , y faut que tu travaille un peu, parce que KCC y demande, y demande mais y paye pas beaucoup :?

Encore milles merci

Publié : jeu. 08/janv./2009 14:20
par Kwai chang caine
Ouuuuuuaaaahhh je t'aime CLS !!!
C'est vraiment genial ce super code de NICO 8)
Merci de m'avoir fait cet exemple, car j'avais essayé avec celui que DOBRO avait donné et evidemment, je n'y etais pas arrivé :oops:

C'est trop de la balle, donc si j'comprend bien (Attention roulement de tambour Vrrrrrrr Vrrrrrrrr) On partage 10 K de memoire entre les deux programmes :D

Ah ce NICO mais ou y va cherche tout ça :roll:

Merci merci, ça va me servir maintenant que j'ai enfin compris, peut etre pas pour ce probleme, parceque si on peut passer le tableau ça evitera d'ecraser une mouche avec une massette, mais pour un autre que j'ai depuis pas mal de temps.

Bon y faut que tu travaille......n'oublie pas car autrement la paye .....couic
Et KCC y gagne pas assez pour nourrir ta famille et la sienne :lol:

Publié : jeu. 08/janv./2009 15:20
par Kwai chang caine
Ayyyaaaaiii !!!!
J'ai eu la réponse

Grace à mon maitre SROD, qui a été tres gentil avec son cerf 8)
Et bah dis donc......j'etais pas pres de trouver moi 8O

Je vous apporte le code tout chaud, car je pense que ça pourra servir à "quinquin" un jour :roll:

Explication de SROD sur mon code qui marche pas

It's crashing because you are crossing the heap boundary between the client application and the dll.

When the dll is attempting to write a string into the array, it first tries to free the existing string. The problem is that these strings are allocated by the main application and are stored in a different heap than the one the dll works with. In short the dll is attempting to free heap memory which it does not have access to because it cannot access the heap pointer created by the main application. This will always result in crashes.

One way around it is to have the main application initialise the array strings with space characters and then have the dll physically poke strings into the underlying buffers etc. This way the dll will not attempt to free any memory that it has no access to
:

Traduction GOOGLE :?

C'est parce que vous crashait franchissent la frontière entre le tas de l'application cliente et les dll.

Lorsque la dll est de tenter d'écrire une chaîne de caractères dans le tableau, il essaie d'abord de libérer la chaîne existante. Le problème est que ces chaînes sont attribués par l'application principale et qui sont stockés dans un autre segment que celui fonctionne avec la dll. En bref, le dll est libre d'essayer de tas mémoire dont il n'a pas accès, car il ne peut pas accéder au tas pointeur créé par l'application principale. Ce sera toujours en cas de choc.

Une manière de contourner cela est de l'application principale initialiser l'ensemble des chaînes de caractères avec l'espace et ont ensuite fouillé la dll physiquement dans les chaînes de sous-tampons etc De cette façon, les dll de ne pas tenter de libérer la mémoire qu'il n'a pas accès à:


Dll code :

Code : Tout sélectionner

;*ptr will point to the zeroth element. 
ProcedureDLL ListeDll(*ptr.INTEGER) 
  If *ptr\i 
    PokeS(*ptr\i, "Index 0") 
  EndIf 
  *ptr + SizeOf(INTEGER) 
  If *ptr\i 
    PokeS(*ptr\i, "Index 1") 
  EndIf 
EndProcedure 


Client code :

Code : Tout sélectionner

Dim Essai.s(30) 

;It is important that you initialise the array elements before having the dll adjust the strings! 
  Essai(0) = Space(128) 
  Essai(1) = Space(128) 

If OpenLibrary(0, "dll.dll") 
  CallFunction(0, "ListeDll", @Essai()) 
  Debug Essai(0)  
  Debug Essai(1)  
  CloseLibrary(0) 
EndIf 
 

Publié : jeu. 08/janv./2009 15:51
par Kwai chang caine
Voila, j'ai un peu modifié le bijou de SROD pour en faire une vulguaire pierre :D

On sait jamais, si un jour y'en a un encore moins bon que moi (Aaarrrrf, Aaarrrrf, Aaarrrrf :lol: ) qui en a besoin .....

Client

Code : Tout sélectionner

Dim Essai.s(10) 
LenArray = ArraySize(Essai())

For i = 1 To LenArray
 Essai(i) = Space(128) 
Next 
  
If OpenLibrary(0, "c:\dll.dll") 

 CallFunction(0, "ListeDll", @Essai(), LenArray) 
  
 For i = 1 To LenArray
  Debug Essai(i)  
 Next 
 
 CloseLibrary(0) 

EndIf 
Dll

Code : Tout sélectionner

ProcedureDLL ListeDll(*ptr.INTEGER, LenArray) 
 
 Dim Tablo.s(LenArray)
  
 x = 0 
 x+1:Tablo(x) = "J'aime" 
 x+1:Tablo(x) = "les " 
 x+1:Tablo(x) = "bananes" 
 x+1:Tablo(x) = "parceque ya" 
 x+1:Tablo(x) = "pas " 
 x+1:Tablo(x) = "d'os" 
 x+1:Tablo(x) = "dedans" 
  
 For i = 0 To LenArray
  
  If *ptr\i 
   PokeS(*ptr\i, Tablo(i)) 
  EndIf 
  
  *ptr + SizeOf(INTEGER) 

 Next 
 
EndProcedure  
Encore merci à tous de votre precieuse aide 8)