Hola:
Si solo necesitas listar los procesos sin la ruta puedes hacerlo con el siguiente código, la ventaja es que funciona en todas las versiones de Windows con cualquier versión de C++Builder. Para probarlo solo necesitas añadir un TListBox (ListBox1) y lo siguiente en el constructor del form:
Código:
// Añadimos: #include<Tlhelp32.h>
PROCESSENTRY32 proc = { sizeof(proc) };
HANDLE hSysSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if ( hSysSnapshot != reinterpret_cast<HANDLE>(-1)
&& Process32First(hSysSnapshot, &proc) )
{
ListBox1->Clear();
do
{
char str[512];
wsprintf(str, "%s (id=%lu)", proc.szExeFile, proc.th32ProcessID);
ListBox1->Items->Add(str);
} while ( Process32Next(hSysSnapshot, &proc) );
}
CloseHandle (hSysSnapshot);
Y ya si necesitas la ruta y poder obtener mas información sobre cada proceso puedes usar lo siguiente, aunque solo funciona en NT/2000/XP. En el ejemplo solo se obtiene la ruta como dato extra a la de arriba, pero puedes obtener mucha mas información, para ello mira el apartado
PSAPI del API.
Código:
//--- Cargamos dinamicamente la libreria "psapi.dll"
// (En versiones mas actualizadas (BCB6) no necesitamos hacer esto.
// Solo añadir #include<psapi.h> y la libreria "psapi.lib")
typedef BOOL (__stdcall *PFEnumProcesses)(DWORD*,DWORD,DWORD*);
typedef BOOL (__stdcall *PFEnumProcessModules)(HANDLE,HMODULE*,DWORD,LPDWORD);
typedef DWORD (__stdcall *PFGetModuleFileNameEx)(HANDLE,HMODULE,LPTSTR,DWORD);
PFEnumProcesses fEnumProcesses;
PFEnumProcessModules fEnumProcessModules;
PFGetModuleFileNameEx fGetModuleFileNameEx;
HINSTANCE hLib = LoadLibrary("psapi.dll");
if (hLib)
{
fEnumProcesses = reinterpret_cast<PFEnumProcesses>(
GetProcAddress(hLib, "EnumProcesses") );
fEnumProcessModules = reinterpret_cast<PFEnumProcessModules>(
GetProcAddress(hLib, "EnumProcessModules") );
fGetModuleFileNameEx = reinterpret_cast<PFGetModuleFileNameEx>(
GetProcAddress(hLib, "GetModuleFileNameExA") );
if (fEnumProcesses && fEnumProcessModules && fGetModuleFileNameEx)
{
//--- Obtenemos la lista de indentificadores de proceso
DWORD aProcesses[1024], cbNeeded, cProcesses, i;
if (!fEnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
return;
//--- Calculamos cuantos indentificadores fueron devueltos
cProcesses = cbNeeded / sizeof(DWORD);
//--- Mostramos información de cada proceso
ListBox1->Clear();
for (i=0; i<cProcesses; i++)
{
char szProcessName[MAX_PATH] = "desconocido";
DWORD processID = aProcesses[i];
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION
| PROCESS_VM_READ, FALSE, processID);
HMODULE hMod;
if (hProcess)
{
if (fEnumProcessModules(hProcess, &hMod,
sizeof(hMod), &cbNeeded))
{
fGetModuleFileNameEx(hProcess, hMod,
szProcessName, sizeof(szProcessName));
String str("");
str.sprintf("%s (Process ID: %u)",
szProcessName, processID);
ListBox1->Items->Add(str);
}
CloseHandle(hProcess);
} // if hProcess
} // for i
} // if
FreeLibrary(hLib);
} // if hLib
Codigo by _Leo
Saludos Cordiales