Page 1 sur 1

Retour des API windows

Publié : mar. 06/sept./2005 0:14
par LeCyb
En utilisant les fonctions de l'API windows je voudrais avoir une petitre précision à propos des chaînes.

Quand j'ai le msdn qui me dit ceci:

Code : Tout sélectionner

char* FAR inet_ntoa(
  struct   in_addr in
);
Je récupère la chose en faisant:

Code : Tout sélectionner

*res.l = inet_ntoa(...)
Je voudrais être certain que je dois bien libérer ce buffer

Code : Tout sélectionner

FreeMemory(*res)
Si je ne libère pas je suppose que je vais avec une perte en mémoire ?
Si je libère je suppose que je ne vais pas avoir de problème ?

Merci :)

Publié : mar. 06/sept./2005 8:09
par Flype
coucou,
voir doc msdn :
The application should not make any assumptions about the way in which the memory is allocated. The data is guaranteed to be valid until the next Windows Sockets function call within the same thread—but no longer. Therefore, the data should be copied before another Windows Sockets call is made.
donc en gros, il ne faut pas libérer la chaine, c'est le winsock qui s'en charge car au prochain appel à cette fonction la chaine est libérée et réallouée. à toi de faire une copie en mémoire pour ton appli avant réallocation.
donc tout dépend de ce qui est décrit dans la doc... :wink:

Publié : mar. 06/sept./2005 9:18
par Backup
char* FAR inet_ntoa(
struct in_addr in
);


Je récupère la chose en faisant:


*res.l = inet_ntoa(...)
heu j'y connais rien mais le "char*" ne veut t'il pas dire qu'il sagit d'un pointeur de Chaine ??

dans ce cas pourquoi avoir fait :

"*res.l = inet_ntoa(...)"

et pas

"*res.s = inet_ntoa(...)" ??





8O

Publié : mar. 06/sept./2005 9:22
par LeCyb
Merci Flype :p

Dobro, c'est juste pour que ma fonction soit thread-safe.

Publié : mar. 06/sept./2005 11:47
par lionel_om
Bah pourquoi pas res = ... ou *res.b = ...
???
Ca me parait plus logique :!: :?:

Publié : mar. 06/sept./2005 21:50
par LeCyb
Ben res.b ça va être difficile d'y placer une adresse 32 bits, un Long me semble plus judicieux.
Mettre *res me semble plus logique car en général un pointeur reçoit une adresse.

Publié : mer. 07/sept./2005 9:58
par Dr. Dri
et pk pas *res.Bytes ?

Dri

Publié : mer. 07/sept./2005 12:28
par lionel_om
J'ai mis *res.b

Exemple :

Code : Tout sélectionner

s.s = "Coucou"

*pt.b
*pt = @s

i = 0
While PeekB(*pt + i)
  Debug Chr(PeekB(*pt + i))
  i + 1
Wend

Publié : mer. 07/sept./2005 12:55
par Dr. Dri
c'est normal... c'est un pointeur alors il pointe vers une adresse... il sera TOUJOURS de 32bits.

L'intéret des pointeurs en PB c'est de les utiliser avec des structures...

Dri ;)