2012-02-25 38 views
0

有人可以說我是否正確使用它?GetProcessImageFileName和LPTSTR

LPTSTR nameProc = ""; 
... 
GetProcessImageFileName(hProcess, nameProc, 50); 

printf("name process : %s\n", nameProc); 

我不使用Win32類型一起使用, 的GetProcessImageFileName的第二參數需要一個LPTSTR的typedef和第三個需要DWORD變量。 如果不是該方法可能我不打印的值nameProc正確的方法? (順便打印一個空字符串)

在此先感謝。 (請儘量避免將我引向某些win32 api文檔,我無意瞭解它,我只需要追蹤一個進程的使用記憶,因此我不會再處理win類型)

EDIT(更新代碼):

void printMemoryInfo(DWORD processID) { 

    HANDLE hProcess; 
    TCHAR nameProc[MAX_PATH]; 

    printf("\nProcess ID: %u\n", processID); 

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

    if (hProcess == NULL) return; 

    if (GetProcessImageFileName(hProcess, nameProc, sizeof(nameProc)/sizeof(*nameProc))==0) 
     printf("error\n"); 

    else printf("%s\n", nameProc); 
} 

int main (void) { 

    DWORD aProcesses[1024], cbNeeded, cProcesses; 
    unsigned int i; 

    if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) { 

     return 1; 
    } 

    cProcesses = cbNeeded/sizeof(DWORD); 

    for (i=0; i < cProcesses; i++) { 

    printMemoryInfo(aProcesses[i]); 
    } 

    return 0; 
} 

回答

3

nameProc必須是一個可變的緩衝區,因爲它是一個輸出參數,此刻它可能只是崩潰。更改此:

LPTSTR nameProc = ""; 

這樣:

TCHAR nameProc[MAX_PATH]; 

亦通MAX_PATH你在哪裏目前通過50。

+0

謝謝,它適用於某些進程標識符。 它似乎並不想打印執行此程序的進程的文件名(但實際上processId位於使用enumProcesses初始化的列表中)。任何想法爲什麼? – user544262772 2012-02-26 00:17:15

+0

你能否更新你的文章以包含枚舉過程的代碼。 – spencercw 2012-02-26 00:19:53

+0

我寫了整個代碼 – user544262772 2012-02-26 00:33:08

4

您可能不想了解Win32類型(和恕我直言,這是一個不錯的主意,因爲在Windows上編程通常API會有用),但即使不理解什麼LPTSTR是MSDN文檔是非常明確的第二個參數:

lpImageFileName [OUT]

               甲足尖r到一個接收可執行文件完整路徑的緩衝區。

所以很明顯你的nameProc是不好的,因爲你沒有爲它分配任何內存。你可能會想寫:

TCHAR nameProc[MAX_PATH]; 
if(GetProcessImageFileName(hProcess, nameProc, sizeof(nameProc)/sizeof(*nameProc))==0) 
{ 
    // some error happened 
}