Lire le clipboard

chichoune13 Messages postés 3 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 17 janvier 2008 - 17 janv. 2008 à 16:10
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 17 janv. 2008 à 17:26
Bonjour à tous,

J'essai désesperemment de lire le contenu du presse-papiers (j'y arrive à peu près je pense....) et de comparer ce contenu à diverses chaines de caractères => c'est là que ça plante !!! En fait c'est à l'exécution que ça plante : j'ai ce fameux plantage Windows qui affiche une fenêtre qui dit ça :
"MonAppli.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagrément encouru" etc etc...

Je sais que c'est un problème de mémoire, de pointeurs, de char* ou un truc dans ce genre mais je n'arrive pas à me dépatouiller de ce pétrain. Ca plante sur le strstr (). Si un expert du presse-papiers pouvait m'aider ce serait cool. Je pense que c'est le contenu du presse-papiers qui n'est pas au bon format, ou un truc dans ce genre...
Voici mon bout de code :

HGLOBAL hgbl;
char *TxtClipBoard = "";
bool Trouve = false;

hgbl = GlobalAlloc(GHND, 200);
if (!hgbl) {
        MessageBox(NULL, "L'allocation d'hgbl a planté !","Debug", MB_OK|MB_ICONINFORMATION); }

OpenClipboard(NULL); // Ouverture du presse-papiers
hgbl = GetClipboardData (CF_TEXT); // On récupère les données texte contenues dans le presse-papiers
TxtClipBoard = (char*)GlobalLock (hgbl); // On met le texte récupéré dans la variable TxtClipBoard

if (strstr (TxtClipBoard, "peu importe le texte c'est là que ça plante !")) {
    MessageBox(NULL, "Le contenu cherché a été trouvé dans le presse-papiers : cool !","Debug", MB_OK|MB_ICONINFORMATION);
    Trouve = true; }
else {
    MessageBox(NULL, "Le contenu cherché n'a pas été trouvé dans le presse-papiers : cool aussi !","Debug", MB_OK|MB_ICONINFORMATION); }

GlobalUnlock (hgbl); // On fait en sorte que la mémoire soit à nouveau déplaçable
EmptyClipboard (); // Vidage du presse-papiers
CloseClipboard (); // Fermeture du presse-papiers

2 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
17 janv. 2008 à 17:17
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
17 janv. 2008 à 17:26
Salut,

char * TxtClipBoard = "";

Là tu demande un pointeur qui pointe sur une chaîne "". Le pointeur sera alloué temporairement sur la pile, la chaîne "" sera en gros une "variable" globale qui sera placé dans ton fichier .exe. Le compilo placera au début de ta fonction un bout de code qui allouera un pointeur (4 octets) et mettra l'adresse de ta chaîne "" dans ces quatres octets.

HGLOBAL hgbl;

Là tu demande juste un pointeur non initialisé. Le compilo mettra une réservation de 4 octets au début de ta fonction. (Ce pointeur pointera n'importe où, et le déreférencer te causerais  de gros soucis)

hgbl = GlobalAlloc ...

Là, tu demande à Windows de réserver 200 octets quelque part en mémoire, dans le tas. Tu met en place l'adresse de cette zone mémoire dans ton pointeur hgbl.

hgbl = GetClipboardData ...

Maintenant, tu demandes à Windows l'adresse du contenu du presse papier, au format texte, et tu la met dans ton pointeur hgbl. Rien ne dit que Windows peut satisfaire ta demande. Il faut vérifier que hgbl n'est pas NULL après cet appel. Au passage, tu as perdu l'adresse des 200 octets que tu as alloué un peu au dessus : fuite de mémoire.

TxtClipBoard = (char*)GlobalLock (hgbl);

Là, tu copies l'adresse des données du presse papier dans le pointeur qui pointait sur ta chaîne "" -> initialiser ta chaîne à "" n'a servi à rien. Tu copies donc 4 octets, pas du tout le contenu du presse papier.

Cela dit, je ne vois pas pourquoi ton code ne marche pas.
0
Rejoignez-nous