Page 1 sur 1

Donner pointeur en paramètre de procedure

Publié : dim. 17/mai/2009 22:27
par Le Soldat Inconnu
Salut,

je complètement perdu avec mes pointeurs

je suis sur un truc tordu et je sais plus trop comment m'en sortir

je dois envoyer un pointeur mémoire en paramètre de procédure.
Et ce pointeur est mis à jour par la procédure. Sauf que je n'ai pas la nouvelle valeur du pointeur de retournée.

Code : Tout sélectionner

#LOAD_LIBRARY_AS_DATAFILE = 2

Procedure GetIconIndexList_Enumerate(hLibrary, lpszType, lpszName,  *Memory)
  Protected Result.l
  Debug "Enumeration :"
  Debug lpszName
  *Memory = ReAllocateMemory(*Memory, MemorySize(*Memory) + 4)
  Debug *Memory
  If *Memory
    PokeL(*Memory + MemorySize(*Memory) - 4, lpszName)
    Result = #True
  Else
    Result = #False
  EndIf 
  ProcedureReturn Result
EndProcedure
ProcedureDLL.l GetIconIndexList(IconFile.s)
  Protected hLibrary, Memory.l
  hLibrary = LoadLibraryEx_(IconFile, #NULL, #LOAD_LIBRARY_AS_DATAFILE)
  If hLibrary <> #NULL
    *Memory = AllocateMemory(4)
    If *Memory
      Debug "Mémoire origine"
      Debug *Memory
      EnumResourceNames_(hLibrary, #RT_GROUP_ICON, @GetIconIndexList_Enumerate(), *Memory)
      Debug "Mémoire au final"
      Debug *Memory
    EndIf
    FreeLibrary_(hLibrary)
  EndIf
  ProcedureReturn *Memory
EndProcedure

*Pointeur = GetIconIndexList("mydocs.dll")
Debug "Mémoire reçue"
Debug *Pointeur
Index = 0
While PeekL(*Pointeur + Index) > 0
  Debug PeekL(*Pointeur + Index)
  Index + 1
Wend
Merci aux spécialistes qui vont pointer le bout de leur nez

Publié : dim. 17/mai/2009 22:39
par Backup
au lieu de

Code : Tout sélectionner

ProcedureReturn *Memory
c'est pas plutot

Code : Tout sélectionner

ProcedureReturn @Memory
ou peut etre

Code : Tout sélectionner

ProcedureReturn @*Memory
qu'il faudrai faire ?? (je dit ça vraiment a tout hasard ) 8O

Publié : dim. 17/mai/2009 22:55
par Le Soldat Inconnu
ouf, ben j'ai finis par trouvé. Foutu bazar, les pointeurs, c'est un belle gymnastique

Code : Tout sélectionner

#LOAD_LIBRARY_AS_DATAFILE = 2

Procedure GetIconIndexList_Enumerate(hLibrary, lpszType, lpszName,  *Memory.Long)
  Protected Result.l
  Debug "Enumeration :"
  Debug lpszName
  *Memory\l = ReAllocateMemory(*Memory\l, MemorySize(*Memory\l) + 4)
  Debug MemorySize(*Memory\l)
  Debug *Memory\l
  If *Memory\l
    PokeL(*Memory\l + MemorySize(*Memory\l) - 8, lpszName)
    Result = #True
  Else
    Result = #False
  EndIf 
  ProcedureReturn Result
EndProcedure
ProcedureDLL.l GetIconIndexList(IconFile.s)
  Protected hLibrary, Memory.l
  hLibrary = LoadLibraryEx_(IconFile, #NULL, #LOAD_LIBRARY_AS_DATAFILE)
  If hLibrary <> #NULL
    *Memory = AllocateMemory(4)
    If *Memory
      Debug "Mémoire origine"
      Debug *Memory
      EnumResourceNames_(hLibrary, #RT_GROUP_ICON, @GetIconIndexList_Enumerate(), @*Memory)
      Debug "Mémoire au final"
      Debug *Memory
    EndIf
    FreeLibrary_(hLibrary)
  EndIf
  ProcedureReturn *Memory
EndProcedure

*Pointeur = GetIconIndexList("mydocs.dll")
Debug "Mémoire reçue"
Debug *Pointeur
Index = 0
While PeekL(*Pointeur + Index * 4) > 0
  Debug PeekL(*Pointeur + Index * 4)
  Index + 1
Wend
FreeMemory(*Pointeur)

Publié : lun. 18/mai/2009 22:26
par flaith
:D Pas mal, ca va me servir, je butais sur un passage de pointeur justement

Sinon dans ta procédure GetIconIndexList(), le protected Memory.l n'est pas utilisé ou alors il faut mettre *Memory.l

Publié : mar. 19/mai/2009 0:35
par Le Soldat Inconnu
bien vu, merci