Newsgroup: it.comp.programmare.win32
Titolo: crasha se gli mando il messaggio...

Ciao!
dopo essermi beccato l'handle della listview desktop gli spedisco un bel
messaggino LVM_GetItemCount, e tutto funziona correttamente restituendomi il
numero di icone presenti sul mio bel desktop.. ora se spedisco il messaggino
LVM_GetItemPosition il tutto crasha allegramente (crash di explorer in
comctl32.dll)...
Why?? Perchč?? (una mezza idea ce l'ho.. č winzozz che č bastardo dentro!)
help please..
Questo č il codice delphi che uso per fare cio'...
{le varie uses che ci sono di solito + la commctrl che contiene le varie
definizioni per lavorare con le listview}
uses ..,.., commctrl;
{una bella forma con un pulsantone grande come una casa :-)) }
procedure TForm1.Button1Click(Sender: TObject);
var punto:TPoint;
    hwnd1,hwnd2,hwnd3:HWND;
begin
  hwnd1:=FindWindow('progman',nil);
  hwnd2:=GetWindow(hwnd1,GW_CHILD);
  hwnd3:=GetWindow(hwnd2,GW_CHILD);
  Showmessage('ItemCount: '+inttostr(ListView_GetItemCount(hwnd3)));
  Listview_GetItemPosition(hwnd3,2,punto);
  showmessage('X: '+inttostr(Punto.x)+' - Y: '+inttostr(Punto.y));
end;
--
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
|()|===================|()|
|()|                                           |()|
|()|        .-=] ExTrEmE [=-.      |()|
|()|                                           |()|
|()|          ICQ#12987528        |()|
|()|   MailTo : 
extr...@tin.it
  |()|
|()|                                           |()|
|()|===================|()|
\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

 LVM_GetItemPosition il tutto crasha allegramente
Diversi mesi fa ho spedito qui un lungo messaggio in cui spiegavo cosa
succede e come risolvere il problema. Purtroppo ora non lo trovo piu`,
ma forse con Deja lo puoi ritrovare. Brevemente: il problema e` che tu
nell'LPARAM di quel messaggio specifichi l'indirizzo di una struttura
POINT, peccato che l'indirizzo sia riferito allo spazio di
indirizzamento del tuo processo e non a quello dell'Explorer (che
"possiede" il desktop)! Quindi quando quel messaggio arriva all'istanza
di COMCTL32 caricata nel processo dell'Explorer, lei tenta di inserire i
dati all'indirizzo specificato, ma in quell'indirizzo non c'e` nulla (o
tutt'altro).
Per risolvere la questione devi scriverti una DLL che contenga le
strutture che ti servono in un blocco di memoria condivisa, e uno hook
per "iniettare" questa DLL nel processo destinazione.
... Catholic (n.) A cat with a drinking problem.
---
Bye! Lorenzo Lutti
http://www.geocities.com/SiliconValley/Peaks/6258/

per "iniettare" questa DLL nel processo destinazione.
Non posso credere che bisogni fare cosi'... Sei sicuro che non esistano
altri mezzi?? Neanche se si alloca con HeapAlloc? E se si fa un VirtualAlloc
e poi un VirtualProtect per cambiare qualche parametro?
Non dirmi che e' l'unico modo... :-(
Saluti,
    Mardy

 non esistano altri mezzi??
Temo proprio di no. Potenzialmente COMCTL32.DLL potrebbe "scoprire" chi
le ha mandato il messaggio [1], e perlomeno restituire come risposta un
codice di errore anziche` andare direttamente in crash... ma
evidentemente la M$ non ha considerato rilevante questo problema.
[1] Perlomeno, mi sembra di ricordare che esista un modo per scoprire il
thread di origine di un messaggio presente nella propria coda... ma
forse mi confondo, ora non ho trovato niente su MSDN.
... Dislexics of the world, UNTIE!


 forse mi confondo, ora non ho trovato niente su MSDN.
Esiste il modo di scoprire SE l'ultimo messaggio e` stato
mandato con SendMessage, o equivalente, da un altro
thread (con la vecchia InSendMessage, o la piu` raffinata
e dettagliata InSendMessageEx), ma, che io sappia, non
da QUALE altro thread sia stato mandato...
Tuttavia, se la window procedure ha ricevuto un indirizzo
in uno dei suoi parametri, una sua gestione molto ma molto
prudente potrebbe evitare crash (usando direttamente la
gestione delle eccezioni strutturate, o indirettamente il
semplice check permesso da IsBadReadPointer e simili).
Alex

 Non dirmi che e' l'unico modo... :-(
La necessita` e` quella di avere della memoria che sia condivisa
fra gli spazi di indirizzamento di (almeno) due processi.  Una DLL
con memoria condivisa non e` certo l'unico modo di ottenere
questo, solo il piu` semplice; le alternative, piu` complesse (e
flessibili), usano direttamente le API di "file mapping", tipicamente
la MapViewOfFileEx e quanto le sta attorno.
Nessuna delle altre API da te nominate si occupa minimamente
di condivisione di (parti degli) spazi d'indirizzi fra processi
separati, quindi non mi e` chiaro come potrebbero aiutare...?
Alex