Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

список процессов [D5, D6, NT4]


Чайник32 ©   (2003-02-10 15:53:00) 

Довольно недавно нашел функцию нахождения списка процессов PSAPI:

function GetAllProcessesInfo(ExtractFullPath: Boolean; procname: string): longint;

function ExtractExeFromModName(ModuleName: String):String;
begin
ExtractExeFromModName := Copy(ModuleName,LastDelimiter("\",ModuleName)+1,Length(ModuleName));;
end;

function GetProcessInfo(PID: WORD):LPMODULEINFO;
var
RetVal: LPMODULEINFO;
hProc: DWORD;
hMod: HMODULE;
cm:cardinal;
begin
hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,false, PID);
GetMem(RetVal,sizeOf(LPMODULEINFO));
if not(hProc = 0) then
begin
EnumProcessModules(hProc, @hMod, 4, cm);
GetModuleInformation(hProc,hMod,RetVal,SizeOf(RetVal));
end;
GetProcessInfo := RetVal;
end;

var ProcList: Array [0..$FFF] of DWORD;
RetVal: TLpModuleInfoArray;
ProcCnt: Cardinal;
I,MaxCnt: WORD;
ModName:array[0..max_path] of char;
ph,mh: THandle;
cm: Cardinal;

begin
EnumProcesses(@ProcList,sizeof(ProcList),ProcCnt);
MaxCnt := ProcCnt div 4;
SetLength(RetVal,MaxCnt);

for i := Low(RetVal) to High(RetVal) do
begin
//Nenoaiiua i?ioannu
case ProcList[i] of
0:begin
RetVal[i].ModuleName := "System Idle Process";
RetVal[i].ModulePID := 0;
RetVal[i].ModuleInfo := GetProcessInfo(i);
end;
2,4,8:begin
RetVal[i].ModuleName := "System";
RetVal[i].ModulePID := 8;
RetVal[i].ModuleInfo := GetProcessInfo(i);
end
//Inoaeuiua
else
begin
RetVal[i].ModulePID := ProcList[i];
RetVal[i].ModuleInfo := GetProcessInfo(ProcList[i]);
//get module name
ph:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,false, ProcList[i]);
if ph>0 then
begin
EnumProcessModules(ph, @mh, 4, cm);
GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));
if (ExtractFullPath) then
RetVal[i].ModuleName := string(ModName)
else
RetVal[i].ModuleName := ExtractExeFromModName(string(ModName));
end
else
RetVal[i].ModuleName := "UNKNOWN";
CloseHandle(ph);
end;
end;
end;

ProcessList.Clear;
for i := Low(RetVal) to High(RetVal) do
ProcessList.Add(RetVal[i].ModuleName);

for i := Low(RetVal) to High(RetVal) do
if RetVal[i].ModuleName=procname then begin
result:= RetVal[i].ModulePID;
break;
end;
// GetAllProcessesInfo := RetVal;
end;


Проблема состоит в том, что если находить список под обычным узером, процедура не может найти имена системных процессов (видимо не может открыть процесс OpenProcess"ом и выдает значение 0). Подскажите плиз, как пофиксить эту неприятность.


Чайник32   (2003-02-10 18:46:00) [1]

спасибо, попробую разобраться.


Игорь Шевченко   (2003-02-10 17:55:00) [2]

В кладовке лежит программа QuerySystemInformation - перечисляет, кроме всего прочего, список процессов. Может, что оттуда можно использовать ?


Чайник32   (2003-02-10 17:22:00) [3]

проверил - GetLastError после строки ph:=OpenProcess... выдает 5 (отказано в доступе)...


ZZ   (2003-02-10 16:52:00) [4]

Может, неможет... Лучше посмотри где валится программа и какую ошибку возвращает функция (которая валится)


Чайник32   (2003-02-10 16:49:00) [5]

установка Debug привилегии моему процессу ничего не дала :(


Игорь Шевченко   (2003-02-10 16:23:00) [6]

Установить Debug priviledge


Наверх

Титульная страница Поиск, карта сайта Написать письмо