Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
In svariate situazioni può essere necessario eseguire un programma
esterno che effettui determinate operazioni. Quasi sempre non è
necessario occuparsi della sua chiusura, ma talvoltà si rende necessario
farlo. Come fare allora a chiudere un processo esterno chiamato dalla
nostra applicazione?
Il
progetto si comporrà di un solo form con pochi controlli. Il funzionamento è semplice quanto banale: l'utente immette il percorso del programma da eseguire nella casella di testo, preme il pulsante Apri programma e questo si avvia. Quando arriva il momento di chiudere il programma, l'utente potrà premere il pulsante Chiudi programma sul form. Se il programma richiamato si chiuderà normalmente tutto filerà tranquillo, ma se il programma ritarda la chiusura apparirà una finestra di richiesta di terminazione dello stesso. Se l'utente risponderà SI a tale finestra, il programma sarà terminato senza alcuna richiesta di salvataggio o conferma. Vediamo il codice, peraltro alquanto complesso:
Alla riga 3 vediamo una prima costante API di nome WM_CLOSE. Esso è un messaggio che verrà inviato alla finestra per richiederne la chiusura. Alla riga 4 abbiamo un'altra costante API per indicare il tipo di processo da aprire.
Alle righe 6-25 viene dichiarato un nuovo tipo di dati
definito dall'utente di nome STARTUPINFO. Alle righe 27 sarà
dichiarato un altro tipo di dati di nome PROCESS_INFORMATION.
Alla riga 37 viene dichiarata la funzione API CreateProcess che consente di avviare un nuovo processo esterno definendo parametri quali la priorità ed il tipo di processo da avviare e riceverne i descrittori del processo in uscita, quali l'handle del processo, l'handle del thread ed altri dati. Alla riga 38 dichiariamo la funzione API TerminateThread che consente la chiusura immediata di un thread. Analogamente, alla riga 39, dichiariamo la funzione API TerminateProcess che termina un processo di cui si conosce l'handle. Segue alla riga 40 la dichiarazione della funzione GetExitCodeThread che restituisce il codice di uscita di un thread. Essa verrà utilizzata per comprendere se il thread lanciato è terminato. Alla riga 41 abbiamo la dichiarazione della funzione GetExitCodeProcess che restituisce il codice di uscita di un processo e verrà utilizzata anche questa per comprendere se il processo è terminato. Una funzione fondamentale si trova alla riga 42. La funzione in questione è la CloseHandle che libera la memoria dagli handle allocati e li rende nuovamente disponibili al sistema. La funzione alla riga 43 è la GetWindowThreadProcessId
e consente di risalire al thread ed al processo che ha generato una certa
finestra. La funzione API successiva è la GetForegroundWindow
che restituisce l'handle della finesta attualmente in primo piano. Verrà
utilizzata per determinare la finesta da chiudere.
L'ultima funzione dichiarata si trova alla riga 47. La funzione in questione è la Sleep e consente di effettuare delle pause all'interno del programma in esecuzione. Prima di vedere il codice di apertura e chiusura del programma vediamo alcune funzioni utili che verranno utilizzate più avanti:
La prima funzione è la IsThread, che verifica che il thread
richiesto sia in esecuzione.
In maniera del tutto analoga alla funzione precedente, la funzione IsProcess verifica che il processo richiesto esista. Viene controllato lo stato di chiusura tramite la funzione GetExitCodeProcess e soltanto se il valore restituito è maggiore di 0 (quindi il processo esiste) la funzione restituirà il valore True (riga 59).
La funzione CloseAllHandle è estremamente semplice. Essa
verifica se il campo hThread della struttura InfProc è maggiore
di 0. Il verificarsi di tale condizione significa che c'è un handle
di thread aperto. Sarà pertanto necessario chiuderlo e questo viene
fatto tramite la funzione CloseHandle (riga 65). Fatto questo
viene azzerato tale valore. Tale funzione serve soltanto per liberare completamente le risorse bloccate
da altre funzioni ed evitare i blocchi o rallentamenti della macchina. |
Giuseppe
Della Bianca
|
Torna all'indice degli HowTo |