GETITEMDATA

Résolu
Signaler
Messages postés
117
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2013
-
Messages postés
117
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2013
-
Salut,
alors voila j'utilises LB_GETITEMDATA poure récuperer une valeure
que j'utilises ensuite dans ReadMemoryProcess pour lire ce que contient
la listbox d'une autre application car GETITEMTEXT ne marche pas..
Je dois faire la meme chose avec une listeview mais LVM_GETITEMDATA
n'existe pas :/

Comment puis je faire ?

Merci

NeoUmbrella Corp.

30 réponses

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Pour recuperer le texte des autres colones (= des subitem d'un item) il faut renvoyer le message LVM_GETITEMTEXT.
Et surtout ne pas oublier VirtualFreeEx & CloseHandle a la fin de la manip.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Envois le message LVM_GETITEM a la listview,
Dans la structure LVITEM tu remplis iItem, iSubItem et tu met le flag LVIF_PARAM pour recuperer le lparam de l'item.
Messages postés
117
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2013

LVITEM LvItem;
LvItem.mask=LVIF_PARAM;
LvItem.state=0;
LvItem.stateMask=0;
LvItem.iSubItem=0;
LvItem.iItem=1;
itmHold = SendMessage(syslistview,LVM_GETITEM,0,(LPARAM)&LvItem);
cout << itmHold << '\n';

Comme ca ?
Sais tu pourquoi ca me renvoit toujours 0 ?

NeoUmbrella Corp.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

Si la listview est dans un autre processus c'est normal que ca marche pas.
Sinon, si SendMessage retourne 1, on recupere le param dans LvItem.lParam.
Messages postés
117
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2013

Effectivement, la listview est dans un autre processus.
Comment dois-je procéder ?
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,


La structure LVITEM doit etre valide dans le contexte du processus qui a créé la listview, donc pour allouer, remplir & lire la structure LVITEM dans l'autre processus il faut utiliser VirtualAllocEx, WriteProcessMemory, ReadProcessMemory, VirtualFreeEx.
Messages postés
117
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2013

Oula je sais que utilisé GetWindowThreadProcessId et OpenProcess
Sais tu si il y'a une source qui explique ces fonctions ?
Parce que la MSDN j'y pige pas grand chose..

Merci pour ton aide
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Voila une source qui utilise cette technique pour lire des infos sur une toolbar dans le processus d'explorer:
http://www.cppfrance.com/code.aspx?ID=24855
Messages postés
117
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2013

Oki merci bien aardman, jvais étudier cette source .

Bonne soirée

NeoUmbrella Corp.
Messages postés
117
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2013

Salut aardman,
voila, j'ai commencer comme ca :

syslistview = FindWindowEx(aoltabpage, 0, "syslistview32", NULL);
cout << "Handle : " << (long)syslistview << '\n';

GetWindowThreadProcessId(syslistview, &pid);
cout << pid << '\n';

hProc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, pid);
cout << (long)hProc << '\n';

ptrVM = VirtualAllocEx(hProc, NULL, sizeof(LvItem), MEM_COMMIT, PAGE_READWRITE);
cout << (long)ptrVM << '\n';

ReadProcessMemory(hProc, ptrVM, (LPVOID)&LvItem, sizeof(LVITEM), &ret);
cout << ret << '\n';

Suis je sur la bonne voie ?
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
MEM_COMMIT | MEM_RESERVE dans VirtualAllocEx.
Sinon avant de lire la structure LVITEM, il faut la remplir, puis envoyer le message a la listview.
Messages postés
117
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2013

ReadProcessMemory(hProc, ptrVM, (LPVOID)&LvItem, sizeof(LVITEM), &ret);
se charge de la remplir nan ?
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Read = lire
Write = écrire
Il faut que tu remplise une structure LVITEM dans ton processus, et que tu la copie d'un coup avec WriteProcessMemory dans la structure LVITEM du processus distant, puis tu envoies le messages LVM_GETITEM, et enfin tu recopie le contenu de la structure LVITEM distante dans le structure LVITEM de ton processus avec ReadProcessMemory.
Messages postés
117
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2013

Je comprends pas avec quoi la remplir la structure de mon process :/
Je peux la laisser vide ?
Vraiment désolé pour la prise de tete a une heure tardive ^^
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Ben tu remplis la structure LVITEM de ton process avec les bon infos (iItem, iSubItem, flag LVIF_PARAM) et tu copie cette structure d'un coup dans la structure allouée dans l'autre processus..
Messages postés
117
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2013

Salut,
voila ou j'en suis :

GetWindowThreadProcessId(syslistview, &pid);
cout << pid << '\n';



hProc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, pid);
cout << (long)hProc << '\n';


LvItem.mask=LVIF_PARAM;
LvItem.state=0;
LvItem.stateMask=0;
LvItem.iSubItem=0;
LvItem.iItem=1;

ptrVM = VirtualAllocEx(hProc, NULL, sizeof(LvItem), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
cout << (long)ptrVM << '\n';

WriteProcessMemory(hProc,ptrVM,(LPVOID)&LvItem, sizeof(LVITEM), &ret);


SendMessage(?,LVM_GETITEM,0,(LPARAM)&LvItem);


ReadProcessMemory(hProc, ptrVM, (LPVOID)&LvItem, sizeof(LVITEM), &ret);

cout << ret << '\n';

Petit pb, je ne sais pas quoi metre comme handle dans le SendMessage ?
Est ce 'syslistview' l'handle de la listview que j'ai trouvé avec FindWindowEx ?
Sinon, ca roule pour le code ?

Encore merci pour ton aide
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Au niveau du code & du handle de la listview ca a l'air d'aller.
Donc, apres le ReadProcessMemory, tu peux lire le lParam de la structure LVITEM, et il ne faut pas oublier de liberer la mémoire et de fermer le handle du process.
Messages postés
117
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2013

Par contre SendMessage me renvoit 0
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Oui il serait bien de rajouter le traitement des erreurs dans ton code:
Faudrait verifier toutes les valeurs de retour des fonctions que tu utilises, et afficher le numero d'erreur avec GetLastError() au besoin.
Messages postés
117
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2013

Et j'obtient -858993460 pour LvItem, est ce normal d'obtenir une valeure
negative ?

NeoUmbrella Corp.