Newsgroup: it.comp.lang.delphi
Titolo: Handle di un programma.

Salve a tutti,
Avrei preferito evitare questa domanda ma...
come faccio a sapere l'handle di un programma che faccio partire con
shellexecuteex, o anche con un'altra procedura?
Grazie, ciao.

> the instance handle of the application that was run,  <<
or the handle of a dynamic data exchange (DDE) server application.
If the function fails, the return value is an error value that is less than
or equal to 32. The following table lists these error values:
....
nb!
Ricorda che la shellexecute non ritorna l'handle della applicazione, ma
l'handle della ISTANZA della applicazione che hai creato con la shellexecute
stessa.
Bye
AS

 stessa.
... Quindi???
Bye.

> ... Quindi???
Niente. era giusto una sottlineatura.
Troppo spesso si parla di handle di applicazione, ma è errato.
L'handle si rifersice ad una istanza di una applicazione.
Bye
AS

Perfetto, tutto chiaro, grazie ancora!

Scusa, un'ultima cosa... puoi dirmi dove sbaglio?
a: longword;
a:=shellexecute(application.Handle,'open','c:\windows\calc.exe',nil,nil,SW_S
HOWNORMAL);
sendmessage(a,wm_close,0,0);
ma l'applicazione non si chiude.
Thks!

 sendmessage(a,wm_close,0,0);
Allora, prima di tutto, invece di usare "longword", usa il tipo che leggi
nell'help.
Secondo, è proprio quello che ti diceva Alberto prima: ti ha anche sottolineato
il fatto che ShellExecute ritorna un HINST, mentre SendMessage vuole come
parametro un HWND.
--
Jax

 parametro un HWND.
Non è una questione sul tipo di parametro (tra le altre cose hInstance credo
sia sempre un tipo HWND) ma su cosa quel parametro contiene. Per intenderci
se gli passi un integer a SendMessage() non ottieni nessun errore. Nello
specifico hInstance indica una sorta di hProcess, ovvero un Handle di
processo mentre per poter chiudere un processo con SendMessage() ci vuole
l'handle della finestra creata dal thread primario. Tuttavia con l'hProcess
si può utilizzare la terminazione brutale via TerminateProcess() -
CloseHandle()
--
- Carlo -
cbertu81(at)libero(dot)it

Se vuoi chiudere una applicazione puoi utilizzare questa funzione che cerca
tra i programmi in esecuzione e se trova quello specifico, lo chiude:
FUNCTION PrgInRun(    FileName : String;//path+nome del file da cercare tra
i programmi in run
                       MaxNrPrg : Word;//max numero di cicli di ricerca (per
evitare un loop infinito)
                   Var FNHandle : THandle) : Boolean;//FNHandle = Handle
dell'applicazione trovata
     VAR  ProcData : TProcessEntry32;
          HDLTool  : THandle;
          HDLProc  : THandle;
          Var1     : Integer;
    BEGIN
          Result := False;
          HDLTool := 0;
          HDLProc := 0;
          ProcData.dwSize := SizeOf(ProcData);
          Try HDLTool := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
              Var1 := 1;
              If Process32First(HDLTool,ProcData) Then
                 Begin
                 Inc(Var1);
                 While ((Process32Next(HDLTool,ProcData)) And
(Var1<=MaxNrPrg)) Do//non più di "MaxNrPrg" processi
                    begin
                    If AnsiCompareText(ProcData.szExeFile,FileName)=0 Then
                       Try HDLProc := OpenProcess(SYNCHRONIZE or
PROCESS_ALL_ACCESS,False,ProcData.th32ProcessID);
                           FNHandle := HDLProc;
                           TerminateProcess(HDLProc, 0);//questa riga è
stata aggiunta per questa occasione
                           Result := True;
                           Break;
                           Finally
                           CloseHandle(HDLProc);
                       End;
                    End;
                 End;
              Finally
              CloseHandle(HDLTool);
          End;
    END;

 sia sempre un tipo HWND)
Okkio!
Su queste cose occore andare molto cauti.
credo anche io che siano la stessa cosa, ovvero, trattasi sempre di WORD o
Integer.
Il problema è che oggi è così, ma non possiamo sapere cosa succedera'
domani.
Un esempio pratico in delphi e il tipo TFileName che >>al momento<<
è semplicemente uguale a string, ma domani... Chissà?
Bye
AS

Grande esempio, hai implementato proprio ciň che mi serviva.
Grazie a tutti,
Paolo.

 sorta di hProcess,
UNA SORTA? UNA SORTA? sono due cose COMPLETAMENTE DIVERSE. Allora, 
fammi riassumere: un hInstance è sempre un hWnd, ma anche un hProcess, 
quindi praticamente tutti gli handle sono la stessa cosa... dove 
ottieni queste informazioni? non è che girano manuali di programmazione 
Windows truccati per disinformare la gente?
-- 
 < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
     Don't stand, REACT!      version 0.0.19. C, C++ and ASM developers
                              and beta testers are welcome!

 ma l'applicazione non si chiude.
Grrrrr. Per stavolta ti rispondo: impara a leggere. La prossima volta 
aprirņ bocca solo per staccarti il naso a morsi


 ottieni queste informazioni?
Ma cosa vai dicendo? hProcess, hInstance etc... sono sempre dei tipi Hwnd,
questo è quel che ho detto.
Tra le altre cose, se non ricordo male, HINSTANCE o HMODULE sono puntatori
al base address del modulo.


 aprirņ bocca solo per staccarti il naso a morsi
Ammazza, ma chi sei, Bem il principe dei mostri?  O__o
Nessuno nasce imparato, e nessuno capisce l'help di win32 al primo colpo.
E poi mica ti ha fatto niente di personale... č stato solo disattento.
--
Jax

 ha scritto nel messaggio:


Si, in generale hai ragione ma non credo sia questo il caso.
Ad esempio in Delphi il tipo hProcess non esiste (e non credo neppure il
tipo hInstance), se poi consideri che esiste una variabile globale di nome
HInstance definita come LongWord ...
Ciao
