2015-07-13 2 views
0

Im пытается заполнить ListBox с помощью списка всех запущенных приложений (Im using C++ Builder) И путем поиска я нашел этот код, который не дает мне Список запущенных только приложения, он печатает некоторые нежелательные текст и запущенные приложенияКак заполнить списокBox всеми запущенными приложениями

#include <windows.h> 
#include <stdio.h> 
#include <tchar.h> 
#include <psapi.h> 

void PrintProcessNameAndID(DWORD processID) 
{ 
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); 



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



if (NULL != hProcess) 
{ 
    HMODULE hMod; 
    DWORD cbNeeded; 

    if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), 
     &cbNeeded)) 
    { 
     GetModuleBaseName(hProcess, hMod, szProcessName, 
          sizeof(szProcessName)/sizeof(TCHAR)); 
    } 
} 



_tprintf(TEXT("%s (PID: %u)\n"), szProcessName, processID); 



CloseHandle(hProcess); 
} 

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++) 
{ 
    if(aProcesses[i] != 0) 
    { 
     PrintProcessNameAndID(aProcesses[i]); 
    } 
} 

    return 0; 
} 

я знаю, что этот код для консольных приложений, но, если он работал, я бы изменить его, чтобы работать на C++ Builder, но его просто не. Итак, что такое правильный код?

+0

Ваш цикл 'for (i = 0; i

+0

@RaymondChen На самом деле, это не мой код, я нашел его на MSDN – Kordy

+0

@ Kordy Это глупо вставлять код из Интернета, не проверяя его и не понимая. –

ответ

0

Этот код должен работать для всех процессов, а не только для консольных. Там может быть более чем один модуль, так что технически это должно быть (старый ANSI код с моего сайта):

HANDLE hProc; 
char szProcessName [80]; 
HMODULE ahMod [10]; 
DWORD dwNeeded; 

hProc = OpenProcess (PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, 
        FALSE, 
        dwPid); 
if (hProc) 
{ 
    if (EnumProcessModules (hProc, 
          ahMod, 
          sizeof(ahMod), 
          &dwNeeded)) 
    { 
     if (GetModuleBaseName (hProc, 
          ahMod[0], 
          szProcessName, 
          sizeof(szProcessName))) 
     { 
     <success> 
     } 
     else 
     { 
     <failure> 
     } 
    } 
    CloseHandle (hProc); 
} 

Кроме того, как Раймон указывает, ваш цикл в зависимости от размера вашего массива (что бы объяснить мусор). Это может быть связано с помощью MS-справки для EnumProcesses, в которой говорится о делении размера массива на размер DWORD, но это только для того, чтобы определить, заполнила ли функция ваш массив, и вам нужно повторно отправить его с большим объемом. Я думаю, вы должны обнулить свой массив процессов до вызова EnumProcesses, то есть использовать memset (или ZeroMemory, если C++-Builder поддерживает этот макрос).

+0

Я скомпилировал ваш код и получил [эту ошибку] ​​(http://www14.0zz0.com/2015/07/13/11/902220747.jpg) даже после включения 'psapi.h', что не так? – Kordy

Смежные вопросы