PDA

View Full Version : Trovare nome eseguibile da handle a finestra


lkr77
16-06-2007, 22:23
Ho visto ke per trovare a partire da un handle di una finestra il nome dell'eseguibile ke l'ha creata bisogna usare le funzioni della libreria psapi...
Il problema è ke la libreria nn è inclusa in windows e nn so come fare ad includerla(uso vc++ 6.0).....Potete dirmi come fare a includerla nel progetto?Una volta inclusa il mio programma è portabile oppure necessita ke la libreria sia presente sui pc dove eseguo il programma?Ma soprattuto Psapi è l'unico modo per trovare il nome dell'eseguibile avendo l'handle di una finestra(tipo ricavato da EnumWindows)?Grazie.....

andbin
17-06-2007, 11:16
Ho visto ke per trovare a partire da un handle di una finestra il nome dell'eseguibile ke l'ha creata bisogna usare le funzioni della libreria psapi...
Il problema è ke la libreria nn è inclusa in windows e nn so come fare ad includerla(uso vc++ 6.0).....Potete dirmi come fare a includerla nel progetto?Una volta inclusa il mio programma è portabile oppure necessita ke la libreria sia presente sui pc dove eseguo il programma?Ma soprattuto Psapi è l'unico modo per trovare il nome dell'eseguibile avendo l'handle di una finestra(tipo ricavato da EnumWindows)?Grazie.....Ecco una funzione per ottenere il nome dell'eseguibile a partire da un handle di finestra:
#define STRICT
#include <windows.h>
#include <psapi.h>


BOOL GetExeFromWindow (HWND hWnd, LPSTR lpszFileName, DWORD dwSize)
{
DWORD dwProcessId, dwModules, dwRet;
HANDLE hProcess;
HMODULE hModule;

if (hWnd == NULL || GetWindowThreadProcessId (hWnd, &dwProcessId) == 0)
return FALSE;

hProcess = OpenProcess (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId);

if (hProcess == NULL)
return FALSE;

if (EnumProcessModules (hProcess, &hModule, sizeof (hModule), &dwModules) == FALSE)
{
CloseHandle (hProcess);
return FALSE;
}

dwRet = GetModuleFileNameEx (hProcess, hModule, lpszFileName, dwSize);

CloseHandle (hProcess);

return dwRet > 0;
}
Linkare con psapi.lib

La libreria PSAPI, se non sbaglio, è utilizzabile solo da NT 4 in poi. Comunque vedere <qui> (http://msdn2.microsoft.com/en-us/library/ms684884.aspx) su MSDN.
Per poter avere informazioni sui processi anche sui Win 9x, c'è da usare la libreria "Tool Help".

lkr77
18-06-2007, 07:13
Ma per includere psapi.dll nel progetto mi dovrebbe serivire il .lib e il .h ma dove li trovo?Ci sono in qualke cartella di windows oppure li posso scaricare da qualke parte?

andbin
18-06-2007, 09:31
Ma per includere psapi.dll nel progetto mi dovrebbe serivire il .lib e il .h ma dove li trovo?Ci sono in qualke cartella di windows oppure li posso scaricare da qualke parte?Il VC++ 6 non è certo recentissimo ma credo che psapi.h e psapi.lib li abbia (purtroppo non ho possibilità di verificare). E comunque lo verifichi tu in un attimo: vai sotto la root del vc++, e fai dir psapi.* /s

Poi basta andare nelle proprietà del progetto e nella sezione dedicata al Linker specificare come input la libreria psapi.lib.