PDA

View Full Version : [c++] l'api killprocess


xciaoatuttix
26-07-2008, 16:00
salve a tutti :)
ho trovato in un programma in c++ una cosa del genere:

killprocess("programma.exe");

solo che sono andato sul sito msdn e mi dice che la killprocess accetta come parametro di ingresso solo il pid e non il nome del programma.
come mai? :muro:

lorenzo001
26-07-2008, 17:39
Leggi bene il codice ... probabilmente c'e' anche il sorgente di quella funzione.

tomminno
28-07-2008, 07:45
salve a tutti :)
ho trovato in un programma in c++ una cosa del genere:

killprocess("programma.exe");

solo che sono andato sul sito msdn e mi dice che la killprocess accetta come parametro di ingresso solo il pid e non il nome del programma.
come mai? :muro:

Sicuramente farà l'elenco dei processi attivi e prenderà il PID corrispondente al programma fornito.
Non è la killprocess delle Win32

71104
28-07-2008, 09:23
Non è la killprocess delle Win32 anche perché non esiste nessuna killprocess in Win32 :fagiano:

eraser
28-07-2008, 09:24
anche perché non esiste nessuna killprocess in Win32 :fagiano:

:D

tomminno
28-07-2008, 09:57
Eh già è CloseProcess :doh:

eraser
28-07-2008, 10:07
Eh già è CloseProcess :doh:

Forse è TerminateProcess (http://msdn.microsoft.com/en-us/library/ms686714(VS.85).aspx) :fagiano:

lorenzo001
28-07-2008, 10:43
Eh già è CloseProcess :doh:

Errore ... ma piano piano ci arrivi ... magari se dai un'occhiata a MSDN e' meglio ...

tomminno
28-07-2008, 10:47
Errore ... ma piano piano ci arrivi ... magari se dai un'occhiata a MSDN e' meglio ...

Eh il brutto di usare codice scritto tanto tempo fa, ormai mi ero abituato al mio CloseProcess.
bisogna aprire un handle al processo e usare teminateprocess.
Arrrgh


bool CloseProcess(DWORD pid)
{
HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS,false,pid);
if (!TerminateProcess(processHandle,0))
{
//error = ::GetLastError();
return false;
}
CloseHandle(processHandle);
return true;
}

71104
28-07-2008, 20:32
bool CloseProcess(DWORD pid)
{
HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS,false,pid);
if (!TerminateProcess(processHandle,0))
{
//error = ::GetLastError();
return false;
}
CloseHandle(processHandle);
return true;
}
pessima: fallisce nel caso in cui tu abbia PROCESS_TERMINATE ma non possa avere tutti gli altri permessi. poi mi piace che chiami pure la GetLastError, come se non sapessi cos'è che è andato storto :asd:

ah, tra l'altro l'uso diretto del tipo bool è sconsigliato; meglio BOOL.

edit - e quasi dimenticavo, hai un leak: se fallisce la TerminateProcess non chiudi l'HANDLE. mai visti così tanti errori in così poche righe :asd:

edit2 - ciliegina sulla torta, l'inesattezza semantica: al secondo parametro della OpenProcess hai passato un bool, mentre lei voleva un BOOL :fagiano:

tomminno
29-07-2008, 07:36
pessima: fallisce nel caso in cui tu abbia PROCESS_TERMINATE ma non possa avere tutti gli altri permessi. poi mi piace che chiami pure la GetLastError, come se non sapessi cos'è che è andato storto :asd:

ah, tra l'altro l'uso diretto del tipo bool è sconsigliato; meglio BOOL.

edit - e quasi dimenticavo, hai un leak: se fallisce la TerminateProcess non chiudi l'HANDLE. mai visti così tanti errori in così poche righe :asd:

edit2 - ciliegina sulla torta, l'inesattezza semantica: al secondo parametro della OpenProcess hai passato un bool, mentre lei voleva un BOOL :fagiano:

Così dovrebbe andare meglio.

bool CloseProcess(DWORD pid)
{
HANDLE processHandle = OpenProcess(PROCESS_TERMINATE,FALSE,pid);
BOOL res = TerminateProcess(processHandle,0);
CloseHandle(processHandle);
return res == TRUE;
}

71104
29-07-2008, 11:21
che differenza c'è tra bool e BOOL e perchè è meglio il secondo? l'ho eloquentemente spiegato tempo fa su Usenet:

> Evita di dire cazzate, per cortesia. BOOL è l'ennesima stronzata
> Microsoft fuori standard. Il C++ prevede il tipo bool che è benissimo
> mappabile, a livello implementativo del compilatore specifico, su ciò
> che più aggrada al processore e alla tua testolina.


l'uso di tale tipo è sconsigliato sui compilatori che ne definiscono la
dimensione a 1 byte quando le dimensioni di allineamento della piattaforma
ammontano a 4. è sconsigliato su molti compilatori per Win32, tra cui il
CL di Microsoft.

vecchie versioni di tale compilatore ponevano accortamente sizeof(bool) a
4, ma la cosa è cambiata suppongo per ragioni di compatibilità con altri
compilatori che invece già lo ponevano a 1. ciò ha reso necessario la
definizione di BOOL non come bool ma come int o qualcosa del genere. il
fatto che in Win32 si usi una nomenclatura ben precisa che astrae dal
linguaggio è un'ottima strategia che permette a Microsoft di risolvere
situazioni come questa, anche se tu la trovi l'"ennesima stronzata fuori
standard": se Win32 usasse bool Microsoft avrebbe avuto un bel problema
nel cambiare la dimensione di quel tipo.


mi immagino la scena di quando è stato fatto tale cambiamento: il classico
programmatore antimicrosoftiano che però è costretto ad usare VC++ per
lavoro sta facendo la sua cagata di programma che ritiene un capolavoro;
il programmatore è un anticonvenzionale e lotta per Linux e per le sue
idee, combatte idealmente il monopolio di "mamma M$" (scritto abbreviato e
col dollaro) scrivendo il commento "// #exclude <windows.h>" accanto
all'include ed usando giustappunto bool in quanto gli standard non di
Microsoft, come il C++, gli piacciono di più di quelli di Microsoft. il
programmatore si trasferisce, per necessità ma con disgusto, sulla
versione nuova fiammante di VC++ e nota il cambiamento nonché i problemi
di compatibilità con le sue DLL. prima si lamenta che Microsoft è la
solita stronza che non capisce un cazzo di retrocompatibilità, e poi ci da
giù pesantemente di Trova-Sostituisci. infine va da bravo a scusarsi col
cliente che un botto di DLL vanno sostituite. ma che goduria, ma come mi
sollazzano gli antimicrosoftiani. scusa la digressione.

post originale:
http://groups.google.com/group/it.comp.programmare.win32/msg/b3f91125130282a9?dmode=source

banryu79
29-07-2008, 12:04
[OT]
Quella dello sparare piuttosto che prendere la mira è una chicca :D
[OT]