Newsgroup: it.comp.lang.delphi
Titolo: CreateProcess ???

Salve a tutti e frazie anticipatamente a che mi aiuterā con questo mio
problema :
Allora: da un eseguibile Delphi creo un'istanza di un secondo eseguibile
(anch'esso scritto in Delphi) usando la CreateProcess.
Come posso fare per chiudere, dal programma creatore,  il programma creato
in maniera ordinata, in modo che alla chiusura si passi per gli eventi di
onClose, ecc. ???
--
ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ
              LA PRIMA REGOLA E' :
      Per ogni giorno di sviluppo esiste
           un giorno precedente in cui
               "Le robe funsionava !"
ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ

onClose, ecc. ???
Devi mandare un messaggio WM_CLOSE al thread principale dell'altra
applicazione.
--
Andrea Laforgia (ICQ 87230455)
"A C program's trick is sometimes a C++ program's trap"
                                          [S.B.Lippman]

 --
Scusa l'ignoranza, ma come faccio. Ho provato anch'io, faccio
SendMessage(cProcessInfo.hThread,WM_CLOSE,0,0);
e non succede nulla.
Dove sbaglio? Penso che interessi anche ad Anri.
Grazie anticipate, siete tutti un mito.
--------------
L'esperienza insegna, ma prima bisogna farsela!

SendMessage(cProcessInfo.hThread,WM_CLOSE,0,0);
Devi usare come primo parametro l'handle della finestra dell'altra


 applicazione.
Il messaggio va inviato all'Handle della finestra creata dal Thread
principale, che poi internamente chiama DestroyWindow.
--
- Carlo -
c.b...@libero.it

principale
E' esattamente cio' che ho detto.


> applicazione.
Azz.. ho usato la parola "thread" ma intendevo, chiaramente, la
finestra principale, ovvero quella creata dal thread principale.
Tra l'altro, il messaggio viene recuperato dal thread solo se si usa
PostMessage. Nel caso, piu' probabile, di SendMessage, viene chiamata
direttamente la window procedure associata alla finestra.


 PostMessage.
Proprio per via della coda dei messaggi.


direttamente la window procedure associata alla finestra.
Scusa, perche' -piu' probabile-? Quando si manda un msg ad un processo
esterno non e' meglio usare un PostMessage? o SendMessageCallback se
proprio si vuole essere notificati del fatto che il messaggio e' stato
processato?
Ulteriore domanda, probabilmente una faq, mi scuso: Una volta creato il
processo con CreateProcess, come si ricava l'handle della finestra con
la coda di messaggi principale dai campi di PROCESS_INFORMATION?
Grazie in anticipo
Paolo Arosio

 la coda di messaggi principale dai campi di PROCESS_INFORMATION?
PROCESS_INFORMATION non contiene quell'informazione.
Sinceramente un'idea la avrei su come trovare quanto richiesto, ma non mi
piace molto ... vediamo se qualcuno ha idee migliori, in caso ti dico la
mia! :)
Ciao! :)






 > la coda di messaggi principale dai campi di PROCESS_INFORMATION?
Paolo, adesso che ci penso è lecito che quell'informazione non ci sia.
Cosa ti fa credere che il thread principale abbia creato una finestra? Nulla
te lo garantisce (infatti esistono processi senza finestra) per cui non puoi
sapere l'handle di una finestra che non sai se sia stata creata o meno. A
questo punto la mia idea su come risalire all'handle di tale finestra è
lecita, te la enuncio, se desideri ti scrivo anche un esempio pratico:
Una volta che il processo è stato istanziato in memoria richiami
EnumWindows, che ti "ricava" tutte le Top Level Windows, direttamente dalla
CallBack puoi passare l'handle della finestra corrente a
GetWindowThreadProcessId e ottieni sia un PID che un TID, confronti quei
valori (anche uno solo dovrebbe essere necessario) con quelli specificati
sulla struttura PROCESS_INFORMATION e se coincidono l'handle corrente della
Callback è quello della finestra associata al Thread.
Ciao!


 EnumWindows, che ti "ricava" tutte le Top Level Windows
Ciao, non sarebbe meglio usare la EnumThreadWindows?
Bye, Davide DG.

 Ciao, non sarebbe meglio usare la EnumThreadWindows?
Sai che non conoscevo questa funzione? Oddio, la avrò sentito nominare 1000
volte ma non la ho mai utilizzata.
Bisognerebbe fare delle prove, ma in teoria dovrebbe essere sufficiente.
Grazie dell'informazione e CIAO! :)


thread, SendMessage lo manda alla WindowProc che lo processa.
Quel che volevo dire e' che mi pare piu' sicuro, quando si cerca di
chiudere un processo, utilizzare PostMessage o SendMessageCallback per
evitare di rimanere bloccati.
il seguente brano e' tratto dall'help di SendMessage:
"Messages sent between threads are processed only when the receiving
thread executes message retrieval code. The sending thread is blocked
until the receiving thread processes the message."
Saluti
Paolo Arosio

[DDG] ... non sarebbe meglio usare la EnumThreadWindows?
che si richiama passando il ThreadID ed enumera tutte le top-level
window _associate_ al thread.
Grazie a entrambi; spesso la facilita' d'uso di Delphi fa dimenticare
che li' sotto c'e' una libreria di funzioni laocoontica.
Per ricapitolare: 
a) una applicazione si fa partire con CreateProcess;
b) si attende che abbia terminato l'inizializzazione con
WaitForInputIdle;
c) si identifica la finestra principale con EnumThreadWindows;
d) le si mandano tutti i messaggi desiderati, e per chiuderla:
e) si manda un WM_CLOSE, oppure un WM_SYSCOMMAND + SC_CLOSE o alla
peggio un TerminateProcess "Use it only in extreme circumstances";
f) si _devono_ chiudere gli handle ritornati da CreateProcess.
[*] mi scuso per la parafrasi ma e' per la sintesi (visto che mi sono
dilungato io). Spero di non aver tradito quello che hai scritto.
Saluti
Paolo Arosio

 until the receiving thread processes the message."
Esatto, è sincrona.
Ciao!


 dilungato io). Spero di non aver tradito quello che hai scritto.
Penso che sia tutto ok!
Ciao! :)


... a quale sezione dell'help fa riferimento quel "pezzo"?
"Creating a Message Loop" in Win32.hlp
Saluti
Paolo Arosio