Newsgroup: it.comp.programmare.win32
Titolo: Come leggere i dati di un altro programma?

Ciao a tutti :-)
E' da un pò che seguo questo NG e vedo sempre ottimi consigli (io cmq non
sono "esperto"... però cerco sempre d'imparare qualche cosa :-D)
Ora però vorrei chiedervi un aiuto, ecco il mio "problema":
Ho un programma (WinMx) che mostra in una lista il risultato delle varie
ricerche (nome programma, dimensione, utente...) io vorrei fare un programma
(uso VisualC++) che riesca ad accedere a questi dati visualizzati, in modo
da poterli poi memorizzare su disco (WinMx li fa solo vedere)
Esiste un metodo che mi permetta l'accesso a questa lista? (E' un pò come se
volessi accedere ad Esplora Risorse per poter leggere i campi nome file,
dimensione, data, attributi... per chi non conosce WinMx)
Mi date qualche "dritta" su dove potrei trovare qualche cosa che mi spieghi
come fare? (O che API - se esistono - devo usare?)
Vi ringrazio molto :-)
--
Virtual
e-mail: __vi...@lombardiacom.it__

 lista? (E' un pò come se volessi accedere ad Esplora Risorse per
Adesso vado un po' di fretta, ma ti dirò lo stesso qualcosa...
WinMx usa le classi SysListView32 per la lista e SysHeader32 per gli header
(la barra contenente i campi File, Bytes, Time, Bitrate, ecc...).
Quindi devi innanzitutto studiare come usare la classe SysListView32.
Le API dovrebbero iniziare con ListView_ e ad ognuna dovrebbe corrispondere
un messaggio.
Comunque puoi semplicemente ottenere l'handle della SysListView32 e usare
una di queste API per ottenere gli item della lista (ogni item ha vari
subitem, in relazione all'header).
Per cercare la finestra prova a usare le funzioni per le finestre come
FindWindow, EnumWindows, ecc...
Ti sarà molto utile un programma (si chiamava "The Customizer"???) che ti
indichi dinamicamente tutti i dati relativi alle finestre: non è detto che
WinMx abbia definito i vari oggetti a priori.
Come ti ho detto ho fretta....per maggiori dettagli aspetta le prossime
risposte :-)
Kiuhnm

 subitem, in relazione all'header).
Ho fatto altri programmi in cui suo CListView e poi i suoi metodi per
inserire o cancellare gli item...
Quindi se io trovo l'handle della lista di WinMx poi potrei usare le
classiche funzioni (Tipo GetItemText...) per leggere i valori? (A me basta
solo leggerli...)
Proverò a vedere MSDN... se hai qualche altro suggerimento... sono sempre in
ascolto!
Ciao e grazie ancora :-)
--
Virtual
e-mail: __vi...@lombardiacom.it__

 sempre in ascolto!
Scarica questo:
http://www.searchlores.org/zipped/customiz.zip
Kiuhnm

 Kiuhnm
L'ho scaricato e l'ho provato :-)
Sono riuscito a beccare la SysHeader32 ma non la SysListView32 :-(
Ad ogni modo il mio problema principale rimane quello di "ottenere il
puntatore" (per capirci) alla ListView che contiene i risultati... poi dopo
riesco tranquillamente (spero!) a leggere i campi usando i metodi classici
di CListView, CCtrlList...
Hai un'idea su come posso ottenere il puntatore a quella lista?
Ho capito (penso) che con FindWindow dovrei riuscire a trovare "il
puntatore" all'applicazione WinMx... ma dopo?
Ti ringrazio ancora se puoi aiutarmi nuovamente :-)
--
Virtual
e-mail: __vi...@lombardiacom.it__

 Ti ringrazio ancora se puoi aiutarmi nuovamente :-)
Il codice che segue cancella tutti gli item dalla lista di ricerca.
Usando Customizer riuscirai a fare lo stesso con le altre liste.
In WinMX ci possono essere varie liste di ricerca, quindi le cose si
complicano un po' e dovrai studiare un modo...
#include "windows.h"
#include "commctrl.h"
HWND hfound;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, char *title)
{
 char buf[256];
 GetWindowText(hwnd, buf, sizeof buf);
 if (strstr(buf, title))
 {
  hfound = hwnd;
  return FALSE;
 }
 else return TRUE;
}
BOOL CALLBACK EnumWindowsProc2(HWND hwnd, char *_class)
{
 char buf[256];
 GetClassName(hwnd, buf, sizeof buf);
 if (strstr(buf, _class))
 {
  hfound = hwnd;
  return FALSE;
 }
 else return TRUE;
}
HWND FindByTitle(char *title)
{
 hfound = 0;
 EnumWindows((WNDENUMPROC)EnumWindowsProc, (LPARAM)title);
 return hfound;
}
HWND FindByClass(HWND parent, char *_class)
{
 hfound = 0;
 EnumChildWindows(parent, (WNDENUMPROC)EnumWindowsProc2, (LPARAM)_class);
 return hfound;
}
void main()
{
 HWND hWinMx = FindByTitle("WinMX v3.3");
 HWND hSearch = GetDlgItem(hWinMx, 0);
 HWND hSList = GetDlgItem(hSearch, 1520);
 hSList = FindByClass(hSearch, "SysListView32");
 ListView_DeleteAllItems(hSList);
}
Kiuhnm

 un messaggio.
Piccolissima precisazione: sono semplici macro definite in windowsx.h e 
windows.h, non vere e proprie API.
-- 
Andrea Bergia - studente
Linux Registred User #281550

 Esiste un metodo che mi permetta l'accesso a questa lista?
Non e` cosi` semplice. In Windows ogni processo ha il suo spazio di
indirizzamento separato, cosi` se tu spedissi un messaggio che passa un
indirizzo (il buffer di una stringa, il puntatore a una struttura,
ecc..) a un altro processo, la cosa non funzionerebbe: il controllo
cercherebbe di scrivere/leggere il *suo* spazio di indirizzamento, non
il tuo, e in molti casi manderebbe in crash il proprio processo.
Per fare cose del genere devi "iniettare" il tuo codice nello spazio di
indirizzamento dell'altro processo. Questo si puo` fare con le funzioni
degli hooks, guarda SetWindowsHookEx() e argomenti correlati.
Ovviamente tutto cio` non vale per i messaggi "semplici" che non
contengono puntatori ma soltanto parametri immediati, e per i messaggi
per i quali e` Windows stesso a farti il marshaling (tipo WM_COPYDATA).
Nel caso dei Tree/List Controls, puoi fare qualcosina ma la maggior
parte dei messaggi passano delle strutture e quindi sei obbligato a fare
quanto detto sopra.
--
Lorenzo

 e windows.h, non vere e proprie API.
Hai ragione e questo spiega anche perchè Msdev non mostra il prototipo come
fa di solito.
Kiuhnm

 void main()
int main()
--------------------------------
Inviato via 
http://usenet.libero.it

 complicano un po' e dovrai studiare un modo...
[CUT]
Ciao! :-)
Scusami tanto se sono "sparito" ieri ma FastWeb ha avuto problemi nella mia
zona e sono rimasto senza telefono ed internet fino a questa mattina!
Ho provato il codice che mi hai scritto... ti ringrazio MOLTO, sei un
fenomeno!!
Ora me lo studio per benino, grazie ancora per il tempo che mi hai dedicato
:-)
P.S.
Da quanti anni programmi in C?
Hai imparato "da te"?
Io ho iniziato all'ITIS ma non è che insegnino chissà che... mi sono dovuto
arrangiare ed ora con MFC e DataBase me la cavicchio... ma per il resto...
"come faccio a venire sul tuo pianeta"??? :-)))
Ciao ed ancora grazie tante!
--
Virtual
e-mail: __vi...@lombardiacom.it__

"Lorenzo Lutti" <lorenz...@DOHtiscalinet.it> ha scritto nel messaggio
news:Pirh9.2849$Hc7....@twister1.libero.it...
Capisco... ora provo a "studiarmi" il codice che mi ha scritto Kiuhmn e di
capire per bene come funziona :-)
Grazie a tutti :-D
Spero un domani di poter ricambiare il favore :-)
--
Virtual
e-mail: __vi...@lombardiacom.it__

 il resto... "come faccio a venire sul tuo pianeta"??? :-)))
Sempre che si tratti di un altro pianeta, programma programma e ancora
programma. I risultati arriveranno.
Non mi accontento mai di quello che so e, devo ammetterlo, ho imparato di
più in 6 anni cracking che in 8 anni di programmazione!!!
Adesso programmo kernel debugger (tipo il Softice) quindi sono ancora in un
certo senso nel mondo del cracking.
Ho programmato Simulatori di Fisica (corpi rigidi, particelle, ecc...),
Radiosity (stocastici e non), motori grafici (quando ancora non esistevano
(o erano poco conosciute) le schede 3d!) e ultimamente mi sto dedicando alla
crittografia (principalmente a quella con chiave pubblica).
Ah dimenticavo...ho programmato vari tool per Internet...ma non troppo
legali...comunque a scopo didattico.
Kiuhnm

 legali...comunque a scopo didattico.
ROTFL ! ;)


:-(((
Beati voi, io ho solo ISDN, chissa' quando mamma Telecom arrivera' nel
mio paesello :-(((
Stefano "HappyMan" (Lago Maggiore - NO)
--
Personal Web 
http://www.sgr.info
Email 
happyman...@libero.it
 [Togliere nospam per scrivermi]
Salsa Web 
http://web.tiscali.it/happyman
 [Foto salseri/e & I.A.B.L.A. Ring]

 legali...comunque a scopo didattico.
;-)
--
Virtual
e-mail: __vi...@lombardiacom.it__

Ciao... scusa se ti disturbo ancora... ho un piccolo problema :-(
Ho provato a usare ListView_GetItemText ed anche _GetItem perņ non riesco a
leggere il contenuto della lista... (ovviamente ho tolto la riga
DeleteAllItems... :-))
Il "bello" č che se uso _GetItemCout il valore che ottengo č ESATTO!!
Ho provato ad usare una variabile char s[100] sia messa nel main che come
globale ma non cambia nulla... (notare che le 2 funzioni mi ritornato TRUE,
perņ io non ho nessun valore nella mia stringa...)
Se hai ancora un pochino di tempo e di pazienza, mi aiuti?
Ti ringrazio :-)
--
Virtual
e-mail: __vi...@lombardiacom.it__

 riga DeleteAllItems... :-))
Probabilmente è un problema di contesto (quelli che usi sono indirizzi
virtuali e si riferiscono a un contesto, cioè a un processo).
Sono appena tornato quindi dammi un po' di tempo e vedrò come fare senza
scomodare SetWindowsHookEx (come ti è stato giustamente suggerito da Lorenzo
Lutti).
Kiuhnm

 Kiuhnm
Grazie ancora... (ti offrirò da bere :-D)
--
Virtual
e-mail: __vi...@lombardiacom.it__

 rimane vuota :'-(
Ho fatto tardissimo e mi è venuto un gran mal di testa, ma quando
m'impunto.....
In Win98 è sufficiente usare CreateFileMapping e MapViewOfFile, in Windows
XP (ci programmo da 5 giorni :-) ) ho provato con VirtualAllocEx, ma con
scarso successo (quindi bisogna usare metodi un po' più complessi).
Comunque su 98 funziona alla perfezione con la lista di un mio programma, ma
non con quella di WinMX.
Non sono un po' troppo colorate quelle liste?
Io non sono un esperto delle interfacce grafiche di Win però non mi pare che
siano così versatili come appaiono in WinMx. Ho dovuto debuggare WinMX col
Softice per rendermi conto che usa LVM_GETITEMRECT (o simile, non ricordo il
nome preciso) e poi vi disegna dentro da solo!
Quindi i dati sono contenuti soltanto all'interno di WinMX: bisogna
disassemblarlo e capire struttura e locazione della lista.
A questo punto fai prima a trovare su Internet il protocollo dei server
usati per WinMX e a farti un lister tutto tuo!
Kiuhnm

 usati per WinMX e a farti un lister tutto tuo!
Già... anche se non ho mai fatto programmi che utilizzino il protocollo
TCP/IP... vedrò cosa riuscirò a combinare... anche perchè ho trovato il
programma (e forse anche il codice) che fa da Server per WinMx... se riesco
a capire come si fanno le ricerche... posso provare a fare io un programmino
che chieda al server solo la "ricerca" dato che a me serve solo quello :-D
Non sarà facile... ci proverò :-)
Ti ringrazio ancora tanto per il tempo che hai perso per "la mia causa" ;-)
Se un giorno ci incontreremo ti offrirò da bere, promesso!
Ciao e grazie ancora :-)
--
Virtual
e-mail: __vi...@lombardiacom.it__

 causa" ;-) Se un giorno ci incontreremo ti offrirň da bere, promesso!
OK, ciao e buon lavoro :-)
Kiuhnm

 crittografia (principalmente a quella con chiave pubblica).
praticamente conosci tanti campi complessi (!)...ma quanto tempo dedichi 
alla programmazione al giorno?
ciao,
coden