2013-12-23 106 views
0

我正在嘗試彙總Qt中所有進程的列表。爲此,我使用Windows API。 下面的代碼演示了我的努力迄今:爲什麼GetProcessImageFileName返回null而不是進程的地址?

QList<QString> frmProcess::GetAllRunningProcesses() 
{ 
    HANDLE hSysSnapshot = NULL; 
    HANDLE processHandle; 
    PROCESSENTRY32 proc; 


    proc.dwSize = sizeof(proc); 
    hSysSnapshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0); 
    Process32First(hSysSnapshot,&proc); 
    proc.dwSize = sizeof(proc); 

    ui->listWidget->clear(); 
    LPWSTR processPath; 
    list.clear(); 
    do 
    { 
     //This block of code is to get each process's path and store it in a list 
     //PROCESS_ALL_ACCESS is commented out since it fails the program on start-up 

     processHandle = OpenProcess(/*PROCESS_ALL_ACCESS*/PROCESS_QUERY_INFORMATION | 
           PROCESS_VM_READ, 
           FALSE, proc.th32ProcessID); 

     GetProcessImageFileName(processHandle,processPath,MAX_PATH); 
     procpaths.append(QString::fromWCharArray(processPath)); 

     list.append(QString::fromWCharArray(proc.szExeFile)); 

    } while(Process32Next(hSysSnapshot,&proc)); 

    CloseHandle(hSysSnapshot); 
    return list; 
} 

在上面的代碼貼出來,我想獲得儘可能多的信息,我可以得到一個過程,對於這個我的幫助彙集進程名稱的CreateToolhelp32Snapshot,然後通過GetProcessImageFileName獲得他們的路徑。所有這些都發生在每個毫秒的計時器滴答事件中。
如果我運行該程序,幾秒鐘後它崩潰,我得到分段錯誤。
我也試過調試,因爲我無法獲得任何與任何進程相關的路徑!
而令我驚訝的是,我只能得到每個過程路徑的空字符串! 我在做什麼錯?

回答

1

您的GetProcessImageFileName未收到適當的參數。 processPath必須指向有效的緩衝區。

TCHAR processPath[MAX_PATH] = { 0 }; 
GetProcessImageFileName(processHandle, processPath, _countof(processPath)); 

此外,你想檢查返回值,看看你是否成功。

+0

我試過LPWSTR processPath [MAX_PATH],但它給編譯時錯誤!陳述##################################### 錯誤:無法轉換'WCHAR ** {aka wchar_t (HANDLE,LPWSTR,DWORD)' GetProcessImageFileName(processHandle,processPath,MAX_PATH);參數'2'到'LPWSTR {aka wchar_t *}'的'**}'到'DWORD GetProcessImageFileNameW' ^ – Breeze

+0

雖然你的解決方案工作得很好。如果名稱是unicode,TCHAR將無法將它們存儲正確? – Breeze

+0

'TCHAR'與'GetProcessImageFileName'恰當匹配。如果你想使用'WCHAR'(出於某種原因我不知道),那麼你可以在'GetProcessImageFileNameW'中使用它。 –

相關問題