2012-09-18 30 views
0

因此,我需要獲取在計算機上運行的進程的列表,然後獲取每個進程的完整路徑。 (我正在尋找每個進程運行的文件夾)。我使用的是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的值就是「ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ」

+0

你是如何看待輸出的?可能會發布您使用GetModuleFileNameEx試用的代碼 – Indy9000

+0

我正在調試並逐步完成。我編輯了第一篇文章 – discodowney

+0

實際上發現我的代碼有問題。我將PROCESS_VM_READ從OpenProcess調用 – discodowney

回答

0

要獲得您可以使用PSAPI中的EnumProcesses函數進程列表。在結果PID上依次使用OpenProcess,在其句柄上使用GetModuleFileNameEx以檢索可執行文件名稱。類似這樣的:

const size_t maxPids = 1024; 

std::set<std::wstring> processes; 

DWORD pids[maxPids] = {}; 
DWORD bytesReturned = 0; 

if (::EnumProcesses(pids, sizeof pids, &bytesReturned)) 
{ 
    DWORD cProcesses = bytesReturned/sizeof *pids; 

    // set SeDebug privilege 

    for (DWORD i = 0; i < cProcesses; i++) 
    { 
     DWORD pid = pids[i]; 

     if (HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid)) 
     { 
      WCHAR filename[MAX_PATH] = {}; 

      if (::GetModuleFileNameEx(hProcess, NULL, filename, MAX_PATH)) 
      { 
       processes.insert(filename); 
      } 
      else 
      { 
       // handle error 
      } 

      ::CloseHandle(hProcess); 
     } 
     else 
     { 
      // handle error 
     } 
    } 

    // disable SeDebug privilege 
} 
else 
{ 
    // handle error 
} 

請注意,有一些過程無法打開(系統,空閒等)。您可能需要先過濾它們或忽略錯誤。另外,根據系統環境,您可能需要特殊權限才能打開您未創建的進程(SeDebugPrivilege),請參閱有關OpenProcess功能的文檔。

+0

中移出。午餐後,我不想吃這個。謝謝 – discodowney

相關問題