GlobalLock [Résolu]

Ziman 247 Messages postés dimanche 27 avril 2003Date d'inscription 26 septembre 2008 Dernière intervention - 26 août 2006 à 02:18 - Dernière réponse : Ziman 247 Messages postés dimanche 27 avril 2003Date d'inscription 26 septembre 2008 Dernière intervention
- 26 août 2006 à 14:47
Bonjour,

je viens d'un peu chercher après des sources pour gérer le presse-papier et j'en ai trouvé une de BruNews. Bien faite, comme d'hab et je comprend quasi tout sauf deux API. L'un était l'inverse de l'autre :

GlobalLock et GlobalUnlock :

char *Texte;

hMemory = GlobalAlloc(GHND, 5);
Texte = (char*) GlobalLock(hMemory);
GlobalUnlock(hMemory);
lstrcpy(Texte, "brun");
OpenClipboard(hwnd);
EmptyClipboard();
SetClipboardData(CF_TEXT, Texte);
CloseClipboard();

Voilà, donc ca place bien 'brun' dans le presse-papier mais à quoi sert GlobalLock ?

Apprendre le VB6
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 26 août 2006 à 04:26
3
Merci
Salut,
Dans cet exemple, le premier paramètre de GlobalAlloc() est GHND. C'est un attribut qui combine deux autres : GMEM_MOVEABLE et GMEM_ZEROINIT. Le premier attribut indique que la zone mémoire allouée peut être déplacée. Le deuxième sert à mettre à zéro tous les octets de cette zone. Quand la zone est déplaçable, la fonction retourne un handle HGLOBAL sur l'objet mémoire. Ce handle doit être transformé en pointeur sur la zone allouée. C'est le rôle de la fonction GlobalLock(). Elle sert aussi à empêcher la zone d'être déplacée pendant son utilisation. GlobalUnlock() fait l'opération inverse en autorisant à nouveau le déplacement.
Il est à noter qu'on n'a pas besoin d'utiliser GlobalLock() ni GlobalUnlock() si on appelle GlobalAlloc() avec l'attribut GMEM_FIXED ou GPTR. Dans ce cas la zone mémoire est fixe et la fonction retourne directement un pointeur sur le premier octet de cette zone.

Merci racpp 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de racpp
Ziman 247 Messages postés dimanche 27 avril 2003Date d'inscription 26 septembre 2008 Dernière intervention - 26 août 2006 à 13:09
0
Merci
Et si on utilise GPTR comment le type du pointeur est-il déterminé ?

Apprendre le VB6
Commenter la réponse de Ziman
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 26 août 2006 à 13:21
0
Merci
Avec GPTR, un pointeur est retourné. A toi de caster ensuite pour l'utiliser comme tu veux. Par exemple:
char* p = (char*)GlobalAlloc(GPTR, 5);

_____________________________________
Un éditeur de ressources gratuit pour Windows
Commenter la réponse de vecchio56
Ziman 247 Messages postés dimanche 27 avril 2003Date d'inscription 26 septembre 2008 Dernière intervention - 26 août 2006 à 13:24
0
Merci
Mais donc dans l'exemple avec le presse papier, BruNews aurait pu utiliser GlobalAlloc avec GPTR ? Ca serait revenu au meme ?

Apprendre le VB6
Commenter la réponse de Ziman
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 26 août 2006 à 13:30
0
Merci
Non car dans la fonction SetClipboardData, il est spécifié que la mémoire doit être alloué en moveable:

"If the hMem parameter identifies a memory object, the object must have been allocated using the function with the GMEM_MOVEABLE flag"
Sinon ca aurait été possible en effet

_____________________________________
Un éditeur de ressources gratuit pour Windows
Commenter la réponse de vecchio56
Ziman 247 Messages postés dimanche 27 avril 2003Date d'inscription 26 septembre 2008 Dernière intervention - 26 août 2006 à 14:15
0
Merci
Ah donc si j'ai bien compris, dans l'exemple, on crée un segment de mémoire moveable, puis on le bloque pour donner une adresse au pointeur char et ensuite on le débloque pour pouvoir le passer à la fonction SetClipboardData ?

Je sais que je repete +/- la meme chose que vous mais c'est pour voir si j'ai bien compris :p

Apprendre le VB6
Commenter la réponse de Ziman
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 26 août 2006 à 14:23
0
Merci
Oui c'est ca. D'ailleurs à mon avis dans ton exemple, il faudrait faire le GlobalUnlock après le lstrcpy

_____________________________________
Un éditeur de ressources gratuit pour Windows
Commenter la réponse de vecchio56
Ziman 247 Messages postés dimanche 27 avril 2003Date d'inscription 26 septembre 2008 Dernière intervention - 26 août 2006 à 14:47
0
Merci
Oui, c'est vrai que ca serait plus logique.

Merci de toute vos réponses

Apprendre le VB6
Commenter la réponse de Ziman

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.