[求助]Win32 Api高手请指点!
问题的提出:我有一程序在98用Process32First和Process32Next获得各进程的ID和所执行的文件名等信息,并且在获得的文件名里已经包含了路径,但后来在WIN2000里调试时发现用Process32First和Process32Next获得的文件名并不包含路径。 解决的方法:所以我想问问在WIN2000里怎样用进程ID获得该进程的文件路径。如果不用进程ID获得各进程的文件路径也可以。 请知情者答复,也可以加我QQ:69351832
问题的提出:我有一程序在98用Process32First和Process32Next获得各进程的ID和所执行的文件名等信息,并且在获得的文件名里已经包含了路径,但后来在WIN2000里调试时发现用Process32First和Process32Next获得的文件名并不包含路径。 解决的方法:所以我想问问在WIN2000里怎样用进程ID获得该进程的文件路径。如果不用进程ID获得各进程的文件路径也可以。 请知情者答复,也可以加我QQ:69351832
EnumProcessModules
GetModuleFileNameEx
//#include "stdafx.h"#include <windows.h>BOOL GetProcessPath(UINT uProcessID, LPSTR szProcessName, DWORD dwSize)
{typedef BOOL (__stdcall *EnumProcessModules_TYPE) (
HANDLE hProcess,
HMODULE* lphModule,
DWORD cb,
LPDWORD lpcbNeeded
); EnumProcessModules_TYPE _EnumProcessModules = NULL;
HMODULE *pMods = NULL;
DWORD cbNeedSize = 0; HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, uProcessID); if (hProcess == NULL) {
return FALSE;
}
HMODULE hPsapi = LoadLibrary("psapi.dll"); if (hPsapi == NULL) {
CloseHandle(hProcess);
return FALSE;
} _EnumProcessModules = (EnumProcessModules_TYPE)GetProcAddress(hPsapi, "EnumProcessModules"); if (_EnumProcessModules == NULL) {
CloseHandle(hProcess);
FreeLibrary(hPsapi);
return FALSE;
} if (!_EnumProcessModules(hProcess, pMods, 0, &cbNeedSize)) {
CloseHandle(hProcess);
FreeLibrary(hPsapi);
return FALSE;
} pMods = (HMODULE*)LocalAlloc(LPTR, cbNeedSize);
if (!_EnumProcessModules(hProcess, pMods, 0, &cbNeedSize)) {
CloseHandle(hProcess);
FreeLibrary(hPsapi);
LocalFree(pMods);
return FALSE;
}
typedef DWORD (__stdcall *GetModuleFileNameEx_TYPE) (
HANDLE hProcess,
HMODULE hModule,
LPTSTR lpFilename,
DWORD nSize
); GetModuleFileNameEx_TYPE _GetModuleFileNameEx; _GetModuleFileNameEx = (GetModuleFileNameEx_TYPE)GetProcAddress(hPsapi, "GetModuleFileNameExA"); if (_GetModuleFileNameEx == NULL) {
LocalFree(pMods);
CloseHandle(hProcess);
FreeLibrary(hPsapi);
return FALSE;
}
if (!_GetModuleFileNameEx(hProcess, pMods[0], szProcessName, dwSize)) {
LocalFree(pMods);
CloseHandle(hProcess);
FreeLibrary(hPsapi);
return FALSE;
}
LocalFree(pMods);
CloseHandle(hProcess);
FreeLibrary(hPsapi); return TRUE;
}
int main(int argc, char* argv[])
{
CHAR szProcessName[MAX_PATH];
GetProcessPath(0x1fc, szProcessName, MAX_PATH); return 0;
}