Вот неожиданно понадобилось получить список из всех запущенных exe файлов. Xотя казалось бы зачем оно такое может быть надо в simple end-user utility for storing clipboard history, но оказалось что надо. Пришлось изобретать велосипед, что бы труды не пропадали – решил опубликовать.
Вкратце получаем снимок всех процессов в системе CreateToolhelp32Snapshot, итерируясь по нему, для каждого процесса делаем снимок его модулей и получаем полный путь к ехе файлу. Если полный путь не нужен, а достаточно только имени файла – то вторую часть делать не нужно.
Теперь просто код, он простой, написан для универсальности с использованием stl.
wstring GetFullPathForProcess(DWORD pid)
{
// Take a snapshot of all modules in the specified process.
HANDLE hModuleSnap = NULL;
hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
if (hModuleSnap == INVALID_HANDLE_VALUE) return _T("");
MODULEENTRY32 me32 = {0};
me32.dwSize = sizeof(MODULEENTRY32);
if (!::Module32First(hModuleSnap, &me32))
{
::CloseHandle(hModuleSnap);
return _T("");
}
::CloseHandle(hModuleSnap);
return wstring(me32.szExePath);
}
ProcessMappingType GetAllRunningApplication()
{
ProcessMappingType m;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 proc;
proc.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hSnap, &proc))
{
m[proc.szExeFile] = GetFullPathForProcess(proc.th32ProcessID);
while (Process32Next(hSnap, &proc))
m[proc.szExeFile] = GetFullPathForProcess(proc.th32ProcessID);
}
else wxFAIL_MSG(wxString::Format("Error Process32First: %i", GetLastError()));
::CloseHandle(hSnap);
}
else wxFAIL_MSG(wxString::Format("Error Load ToolHelp: %i", GetLastError()));
return m;
}
Все, с вас конфетка 🙂
P.S. И еще, хорошие люди просили сослаться на скандинавский аукцион в Киеве, дык мне не трудно 🙂 А вы верите в подобное?