Una volta avevamo un sistema Fax che creava dei file word, e per fare questo lanciava Word, ma spesso non riusciva a chiuderlo, allora avevo scritto un progamma che ogni 10 minuti registrava i processi di word attivi, e se al passaggio successivo li trovava ancora vivi, li killava....
Ho un po' riadattato il codice, vedi se può essere utile, era un programma sviluppato in poche ore, partendo da un esempio su MSDN, per cui non è certo perfetto, ma come tutorial può andare.
tasks.c
codice:
#include <windows.h>
#include <psapi.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//return 0:killed, 1: not killed
int Kill(int pID)
{
int ret;
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,TRUE,pID);
if(hProcess==NULL)
{
return 1;
}
ret = !TerminateProcess(hProcess,0);
CloseHandle(hProcess);
return ret;
}
char * GetProcessName(DWORD processID ,char * szProcessName, DWORD bufsiz)
{
// Get a handle to the process.
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
0, processID );
szProcessName[0]='\0';
// Get the process name.
if (NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,
bufsiz );
}
else return NULL;
}
else return NULL;
CloseHandle( hProcess );
return szProcessName;
}
int main(int argc, char**argv)
{
char szProcessName[MAX_PATH];
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
return 1;
cProcesses = cbNeeded / sizeof(DWORD);
for ( i = 0; i < cProcesses; ++i )
{
GetProcessName(aProcesses[i],szProcessName,MAX_PATH);
printf("%08X %s\n",aProcesses[i], szProcessName);
}
return 0;
}
ricorda di linkare psapi.lib