因此,我需要獲取在計算機上運行的進程的列表,然後獲取每個進程的完整路徑。 (我正在尋找每個進程運行的文件夾)。我使用的是QueryFullProcessImageName - http://msdn.microsoft.com/en-us/library/windows/desktop/ms684919(v=vs.85).aspx然而我只發現這個代碼需要在Windows XP上工作,並且功能最低的客戶端是Vista。在Windows XP中獲取正在執行的進程完整路徑
那麼有誰知道這樣做的另一種方式?
我想使用GetModuleFileNameEx但它不會工作。我會通過進程句柄,所有我會回來在輸出是「íííííííííííííííííííííííííííííííííííííííííííííííííííííííííí」。
編輯:這是我嘗試使用GetModuleFileNameEx:
HANDLE hProcessSnap;
PROCESSENTRY32 pe32;
string name = procName;
// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
REPORT_ERROR("CreateToolhelp32Snapshot (of processes): err=%d\n", ::GetLastError());
return false;
}
// Set the size of the structure before using it.
pe32.dwSize = sizeof(pe32);
// Retrieve information about the first process,
// and exit if unsuccessful
if(!Process32First(hProcessSnap, &pe32))
{
REPORT_ERROR("Process32First: err=%d\n", ::GetLastError()); // Show cause of failure
CloseHandle(hProcessSnap); // Must clean up the snapshot object!
return false;
}
char pName[MAX_PATH];
//iterate through all processes
do {
//Find start of files name
char *szProcessFilename = strchr(pe32.szExeFile, '\\');
if (szProcessFilename == NULL)
szProcessFilename = pe32.szExeFile;
else
szProcessFilename++; //Skip over last slash
if (_stricmp(procName, szProcessFilename) == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, false, pe32.th32ProcessID);
char procLocationChar[MAX_PATH];
DWORD exe_path_size = MAX_PATH;
DWORD s = GetModuleFileNameEx(hProcess, NULL, pName, exe_path_size);
我做一些更多的東西在此之後獲得的路徑,但PNAME的值就是「ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ」
你是如何看待輸出的?可能會發布您使用GetModuleFileNameEx試用的代碼 – Indy9000
我正在調試並逐步完成。我編輯了第一篇文章 – discodowney
實際上發現我的代碼有問題。我將PROCESS_VM_READ從OpenProcess調用 – discodowney