Problemes mémoire pr KCC,c'est pas que dans la tete [Résolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Problemes de mémoire pr KCC, c'est pas que dans la tete :-(

Message par Kwai chang caine »

Bon cette fois on est synchro GEBONET :D
Merci beaucoup de ton code 8)

Pour le passage du pointeur a la DLL, SROD a utilisé une structure, je crois que c'est a cause de VB :roll:
Parce que maintenant....essaye de l'appeler de VB et recuperer ton tableau...tu va voir c'est drole :lol:

Entre l'UNICODE, et les BSTR....hihihi !!!!
Je me pisse dessus d'avance :lol:
Deja j'arrive jamais a comprendre si il faut mettre en BYVAL ou BYREF, ni non plus les VarPtr et StrPtr qui sont des fonctions non documentée et en principe cachée de VB.
Alors ça fait noir d'essais....et boing... boing...boing...boing...Splash ...plus de RAD, sans meme prevenir...ou au mieux avec un joli panneau erreur de memoire 8O

KCC il est drolement fier, ...il a inventé un code qui ferme le RAD encore plus vite que le bouton QUITTER :D
Peut etre KCC y pourrait vendre le brevet a CROSOFT :roll:

Je ne pense pas avoir le temps de me lancer aujourd'hui, mais je rattaquerais lundi

Je peux te donner le debut de la piste que SROD m'avait donné
Avec ça on arrive a apeller la DLL et lui envoyer le tableau VB
Enfin si des fois tu as deux secondes...
Peut etre peut tu defricher le terrain :wink:

Par contre reste a trouver l'equivalent de PEEK en VB....
Car il ne sait pas faire .... :?

Encore merci pour tout GEBO 8)

Code de la DLL

Code : Tout sélectionner

ProcedureDLL ListStrings(*strPtr.INTEGER, Number)
  numElements = Val(PeekS(*strPtr\i, -1, #PB_Unicode))
  MessageRequester("Array from VB", "Number of elements = " + Str(numElements))
  For i = 1 To numElements
    *strPtr + SizeOf(INTEGER)
    text$ + "Element " + Str(i) + " = " + PeekS(*strPtr\i, -1, #PB_Unicode) + #CRLF$
  Next
  MessageRequester("Array from VB", text$)
EndProcedure
Code de l'EXE

Code : Tout sélectionner

Private Declare Function ListStrings Lib "test.dll" (ByVal PointerArray As Long, Number As Integer) As Long

Private Sub Form_Load()

Dim ArrayString(10) As String
ArrayString(0) = Trim(Str(UBound(ArrayString)))

For i = 1 To 10
  ArrayString(i) = "Sentence " + Str(i)
Next

ListStrings VarPtr(ArrayString(0)), 10

End Sub
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Problemes de mémoire pr KCC, c'est pas que dans la tete :-(

Message par Kwai chang caine »

Bon dommage, c'est pas grave, merci quand meme 8)
Quoi qu'il en soit SROD a créé un PBI de la gestion des COM en partant de Dishelper de C, tout comme TsSoft

La... ce n'est pas la meme chose, a mon humble avis de programmeur du dimanche...
On ne fait que lire la mémoire.
Point ici d'objet, de connection OLE / COM
Juste de l'acces mémoire pour lecture des pointeurs, c'est bien moins compliqué

La seule tuile comme il a dit mon amis DENIS...c'est que je me heurte a l'UNICODE et surement au BSTR qui est un format specifique de gestion des variable par BILOU et son VB de m.... :?

KCC il va continuer, et peut etre qu'il trouvera une ame charitable pour l'aider un peu a chaque caillou qu'il rencontre 8)
Et ben je viens de creuser et j'ai trouver une mine d'or

En fait le gars il utilise l'API LocalAlloc
Et il ecrit dans la mémoire et la relis.

Si "quinquin" de l'assistance ça lui dit quelque chose dans ses souvenirs ????
Ca a pas l'air trop trop compliqué, enfin pas pour moi evidemment :mrgreen:
Mais le code est pas trop long, je ne sais pas si ca peut etre utilisable avec ma lecture de memoire ?? :roll:

Code de la FORM

Code : Tout sélectionner

Dim VarExemple As String

Private Sub Form_Load()
    ' On donne une valeur à VarExemple
    VarExemple = "Salut tout le monde"
    Dim tStr As String
    Dim lPointeur As Long
    tStr = "Exemple d'utilisation des pointeurs mémoire" + vbCrLf + vbCrLf
    tStr = tStr + "Variable 'VarExemple' : " + vbCrLf
    tStr = tStr + "     Valeur=" + VarExemple + vbCrLf
    tStr = tStr + "     Mise en mémoire de la chaine de caractère" + vbCrLf
    lPointeur = PutStringInMemory(VarExemple)
    tStr = tStr + "     Adresse mémoire (pointeur)=" + Str$(lPointeur) + vbCrLf + vbCrLf
    tStr = tStr + "En procédant à l'inverse : On part de son pointeur pour retrouver son contenu :" + vbCrLf
    tStr = tStr + "     GetStringFromPtr(" + Str$(lPointeur) + ")=" + GetStringFromPtr(lPointeur)
    txtDebug.Text = tStr
    DeleteStringInMemory lPointeur
End Sub
Code du module

Code : Tout sélectionner

Option Explicit

' permet de copier une chaine de caractère dans une autre
Public Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
Public Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Any) As Long
Public Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As Long
Public Declare Function LocalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal wBytes As Long) As Long
Const LMEM_FIXED = &H0
Const LMEM_ZEROINIT = &H40

' Permet de récupérer la chaine de caractère en mémoire à partir de son pointeur
Public Function GetStringFromPtr(ByVal lPointeur As Long) As String
    If lPointeur > 0 Then
        GetStringFromPtr = Space(lstrlen(lPointeur))
        lstrcpy GetStringFromPtr, lPointeur
    End If
End Function

' Met une chaine de caractère en mémoire
' La fonction renvoie le pointeur vers le bloc mémoire
' Ne pas oublier de supprimer le bloc à la fin du prog
Public Function PutStringInMemory(ByVal Str As String) As Long
    ' Il faut terminer la chaine par vbnullstring
    If Right(Str, 1) <> Chr$(0) Then Str = Str + Chr$(0)
    ' On copie la valeur de strValue en mémoire
    PutStringInMemory = LocalAlloc(LMEM_FIXED Or LMEM_ZEROINIT, Len(Str))
    lstrcpy PutStringInMemory, ByVal Str
End Function

' Supprime une chaine de caractère en mémoire
Public Function DeleteStringInMemory(ByVal lPointeur As Long)
    LocalFree lPointeur
End Function
J'ai essayé d'adapter à mon code, en utilisant la fonction PEEK de VB....et j'obtiens come dab des hieroglyphes 8O
Depuis un mois, KCC il devenu specialiste des pyramides et tout ce qui s'en suit :D
Il a ecris plus de papyrus en un mois que RAMSES dans toute son existence :D
Bon j'ai essayé ce code, mais peut etre qu'en comprenant celui du dessus on peut modifier le miens pour qu'il lise de l'ASCII

Mais j'ai aussi essayé avec PEEKBYTE et la j'obtiens des chaines vides...
C'est bien mieux, car je me demande cette fois si c'est pas l'histoire de l'unicode et l'octet en trop
Je doit peut etre lire que l'octet vide ou un truc comme ça :roll:

Au fait.... en reponse a mon ami DENIS, je prefererais ne pas compiler en UNICODE mes DLL.
J'ai peur que ça foute le "waï" dans toutes mes fonctions :roll:

Apres tout c'est VB qui fait le malin...alors c'est a VB d'etre puni :lol:
Une fois que j'aurais trouvé comment lire une DLL C avec VB, je devrais pouvoir lire une DLL PB avec VB :roll:

Voila ma daube

Code : Tout sélectionner

' http://www.xtremevbtalk.com/showthread.php?t=44459

'\\ API declarations...
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Long, Source As Long, ByVal Length As Long)
Private Declare Sub CopyMemoryByte Lib "kernel32" Alias "RtlMoveMemory" (Destination As Byte, Source As Long, ByVal Length As Long)
Private Declare Sub CopyMemoryFromByte Lib "kernel32" Alias "RtlMoveMemory" (Destination As Long, Source As Byte, ByVal Length As Long)

Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Any) As Long

Private Declare Function ListStrings Lib "test.dll" (ByVal PointerArray As Long, Number As Integer) As Long

Private Sub Form_Load()

 Dim ArrayString(10) As String, IdMemory As Long, Phrase As String
 ArrayString(0) = Trim(Str(UBound(ArrayString)))
 
 For i = 1 To 10
  ArrayString(i) = "Sentence " + Str(i)
 Next
 
 IdMemory = ListStrings(VarPtr(ArrayString(0)), 10)
 MsgBox IdMemory
 
 For i = 0 To 10
  Phrase = Phrase + GetStringFromPtr(PeekByte(IdMemory + i)) + Chr(13)
 Next
 
 MsgBox Phrase
End Sub

Public Function Peek(Address As Long) As Long
 Call CopyMemory(Peek, ByVal Address, Len(Address))
End Function

Public Function PeekByte(Address As Long) As Byte
 Call CopyMemoryByte(PeekByte, ByVal Address, Len(PeekByte))
End Function

' Permet de récupérer la chaine de caractère en mémoire à partir de son pointeur
Public Function GetStringFromPtr(ByVal lPointeur As Long) As String
    If lPointeur > 0 Then
        GetStringFromPtr = Space(lstrlen(lPointeur))
        lstrcpy GetStringFromPtr, lPointeur
    End If
End Function
Bon faut que j'y alle sinon c'est le divorce assuré, ....si "quinquin" il peut au moins me guider, avec ces histoire d'UNICODE et BSTR...ça serait trop cool

Encore merci de votre attention 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Problemes de mémoire pr KCC, c'est pas que dans la tete :-(

Message par Kwai chang caine »

Bon, ma femme est couché.....et la c'est le moment pour tout homosapiens programmus de pouvoir retourner dans l'enfance et braver les interdits des parents qui nous obligeait a nous coucher tot.
Interdits que l'on s'empressait de baffouer, a l'aide d'une lampe de poche sous les draps, pour jouer dans le noir :D

Donc.....prenant mon courage a deux mains.
J'ai essayé d'en terminer avec ce mariage incongru de VB et PB

Et vous allez pas y croire......mais j'ai réussi a 23h15 heure de paris à les faire causer.
Bien sur de la patience .....de la comprehension....ont été nécéssaire.
Mais je crois que "j'y ai arrivé" :D

Parfois...je ne sais pas si ça vous fait ça...mais je me sent comme le professeur foldingue qui est dans son labo et qui decouvre le serum qui va sauver le monde, alors que ce dernier dort lamantablement sans se preocuper de mes "vitales" recherches :?
Et j'suis tellement heureux......que je crierais et danserais dans tous les sens, ce qui inmanquablement reveillerais ma femme et mettrais fin à ma fierté et ma joie de sauver le monde, par un seul mot ou presque de sa bouche :(
VA TE COUCHER ...demain y'a boulot !!!!! :twisted:

Bon je sais que mes recherches n'interessent pas grand monde d'entre vous
Mais comme vous avez eu la gentillesse d'aider KCC dans les plus forts moments de doute
Et puis comme je n'ai que vous pour partager mon bonheur de sauver le monde
Et bien voici le code qui marche, le protocole....que dis je le protocole, l'acte de mariage entre VB et PB, afin que ces derniers puisse regarder un tableau "de maitre" et le voient de la meme couleur :D

Mais c'est pas ça l'important...encore une fois l'homme a vaincu la machine.......et cet homme c'est KCC aujourd'hui.....oui oui oui 8)
Cela fait un mois que je cherche.....a tel point que je ne sais meme plus pourquoi j'en avais besoin :oops:

En plus, tellement ça fait longtemps,...... que j'arrive pas a réaliser que c'est fini.....vu qu'en plus je dort debout...
Demain j'aurais les idées plus claire et comme les matins de noel...je trouverais sous le clavier un code tout fini, preuve de la fin de mon calvaire
Je vais quand meme essayer de faire plus simple...mais si j'y arrive pas....j'aurais celui ci comme planche de salut

Encore merci pour tout votre soutiens 8)
Et comme disait le pape jean paul 2 le soir du concert de jean michel jarre a LYON
Booooooonne nooooouit !!!

Code de la DLL

Code : Tout sélectionner

ProcedureDLL ListStrings(*strPtr.INTEGER)
  
 #ArrayPB = 1
 #ArrayVB = 2
  
 NumElements = Val(PeekS(*strPtr\i, -1, #PB_Unicode))
 OffSet = 4 : TempOffSet = 4
 
 If Not NumElements
  NumElements = Val(PeekS(*strPtr\i, -1, #PB_Ascii))
  IdMemory = AllocateMemory(NumElements + 4)
  TypeArray = #ArrayPB
 Else
  IdMemory = AllocateMemory((NumElements * 2) + 4)
  TypeArray = #ArrayVB
 EndIf
  
 ;MessageRequester("Array from VB", "Number of elements = " + Str(NumElements))
   
 For i = 1 To NumElements
  
  *strPtr + SizeOf(INTEGER)
  
  Select TypeArray 
   Case #ArrayVB 
    Text$ = PeekS(*strPtr\i, - 1, #PB_Unicode) + "|"
    OffSet + (Len(Text$) * 2)
   Case #ArrayPB
    Text$ = PeekS(*strPtr\i, - 1, #PB_Ascii) + "|"
    OffSet + Len(Text$)
  EndSelect
  
  PokeS(IdMemory + TempOffSet, Text$, -1, #PB_Unicode)
  TempOffSet = OffSet
   
 Next
 
 PokeL(IdMemory, OffSet)
 ProcedureReturn IdMemory
  
EndProcedure
Code de VB

Code : Tout sélectionner

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Long, Source As Long, ByVal Length As Long)
Private Declare Sub CopyMemoryByte Lib "kernel32" Alias "RtlMoveMemory" (Destination As Byte, Source As Long, ByVal Length As Long)
Private Declare Function ListStrings Lib "test.dll" (ByVal PointerArray As Long) As Long

Public Sub Form_Load()

 Dim ArrayString(10) As String, IdMemory As Long, Phrase As String, LenArray As Integer, a As Long
 ArrayString(0) = Trim(Str(UBound(ArrayString)))
 
 For i = 1 To 10
  ArrayString(i) = "Sentence " + Str(i)
 Next
 
 IdMemory = ListStrings(VarPtr(ArrayString(0)))
 LenArray = Peek(IdMemory)
 
 For i = 0 To LenArray
 
  a = PeekByte(IdMemory + 4 + i)
 
  If a <> 0 Then
   Phrase = Phrase + Chr(a)
  End If
  
 Next
 
 MsgBox Phrase
 
End Sub

Public Function PeekByte(Address As Long) As Byte
 Call CopyMemoryByte(PeekByte, ByVal Address, Len(PeekByte))
End Function

Public Function Peek(Address As Long) As Long
 Call CopyMemory(Peek, ByVal Address, Len(Address))
End Function
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Re: Problemes mémoire pr KCC,c'est pas que dans la tete [Résolu]

Message par GeBonet »

Ben voilà, ça y est... Depuis le temps :lol:
Bon, vu l'heure j'ai pas essayé, mais je suppose que tout est OK !

Et félicitation, comme quoi, tout viens à point à qui sait attendre (même les idées :lol:)
A++
Abraços !
Windows 7 et Windows 8.1 Pb 5.0 jusque 5.24 Lts 64 et 5.3 (64)/b]
“Ceux qui rêvent éveillés ont conscience de mille choses qui échappent à ceux qui ne rêvent qu’endormis.”
-Edgar Allan Poe-
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Problemes mémoire pr KCC,c'est pas que dans la tete [Résolu]

Message par Kwai chang caine »

Merci GEBO

Et ben ça pas été facile...en fait c'est en faisant une erreur que j'ai trouvé le premier filon 8O
Comme coca cola....quoi :lol:

Remarque je ne peux faire que des erreurs car dans ces cas la, comme je comprend rien, j'ecris tout ce qui me passe par la tete
VarPtr, StrPtr, Byval, Byref et tout ce qui s'en suit :oops:

Je suis content, mais pas encore tout a fait au bout de mes peines....
Mais cela m'ouvre des perspectives....

J'ai bien envie de retourner voir le code de XOMBIE.....celui la il m'a interpelé car il etait si simple 8O
ASM oblige :mrgreen:

Mais je n'ai pas compris exactement ce qu'il faisait....
Tiens ça me donne une idée...je vais le poser dans la rubrique ASM et si un gentil membre y veut bien m'expliquer exactement ce qu'il fait, je saurais si il peut m'etre utile dans ma quette du graal :D

Grosses bises et merci GEBONET et bon reveil 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre