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

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

получение списка процессов [D5, NT4, Win2k]


izhalex ©   (2002-10-30 09:58:00) 

Привет всем! У меня возник вопрос (а точнее биг бага :(
Пытаюсь получить список процессов

procedure GetProcessList;
var
handler :thandle;
data :TProcessEntry32;

function return_name:string;
var
i:byte;
names:string;
begin
names:=""; i:=0;
while data.szExeFile[i]<>"" do
begin
names:=names+data.szExeFile[i];
inc(i);
end;
return_name:=names;
end;

begin
ProcessList.Clear;
handler:=createtoolhelp32snapshot(TH32CS_SNAPALL,0);
if Process32First(handler,data) then
begin
ProcessList.Add(return_name);
while Process32next(handler,data) do
ProcessList.Add(return_name);
end
else
ProcessList.Add("Error getting Process List");
closeHandle(handler);
end;


так вот, под w2k все катит, а под nt процедура Process32First сразу выдает false :( Вопрос: что я не так делаю?


Eugen Honeker   (2002-11-04 00:09:00) [1]

в книжном магазине


SVM   (2002-11-03 23:25:00) [2]

Ладно, все молчим... А как определить хотя бы используюмую память. И вот еще что, где можно найти полный мануал по функции NtQuerySystemInformation?


SVM   (2002-11-03 00:40:00) [3]

Так а давайте определимся с универсальным кодом получения инфы о процессах для всех виндов. Причем инва будет состоять как минимумиз 4х полей: имя процесса, PID, приоритет и исрльзуемая память(как в таскменеджере Win2k). Чтобы в дальнейшем мало возникало подобных воросов на этом форуме.
Заранее всем спасибо.


Внук   (2002-11-02 15:35:00) [4]

GetVersionEx


TankMan   (2002-11-01 21:56:00) [5]

Тогда встречный вопрос, как точно узнать НТ или не НТ на машине?


Внук   (2002-11-01 18:37:00) [6]

psAPI работает под WinNT, под остальными - ToolHelp


TankMan   (2002-10-31 18:47:00) [7]

Так и всетаки, может скажет ктонить? Почему не работает? у меня 98 винды.


Gluka   (2002-10-31 00:56:00) [8]

>Люди, а вот еще попутный вопрос - как узнать параметры, с >какими были запущены приложения?
GetStartupInfo

>для всего стального используй NtQuerySystemInformation (NTDLL.DLL)


TankMan   (2002-10-30 20:27:00) [9]

>>Subfire
Я вот уточнить хотел, этот код под 9х работает? И если да, то
я вот чего не пойму - кусочек твоего кода:

function GetAllProcessesInfo(ExtractFullPath: Boolean = false):TLpModuleInfoArray;
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); //1
MaxCnt := ProcCnt div 4;//2
SetLength(RetVal,MaxCnt);//3
В строчке №3 значение MaxCnt впрочем как и на №2 значение ProcCnt равно 0. Оно что должно выставляться в строчке №1? Или я чего-то не того говорю. В итоге, у меня всегда 0 в этих переменных, и выдается ошибка.


TankMan   (2002-10-30 17:41:00) [10]

Люди, а вот еще попутный вопрос - как узнать параметры, с какими были запущены приложения?


Subfire   (2002-10-30 15:50:00) [11]

Просто никакой хелпы на EnumProcess нету...
а процедура те вернет структуру
type TLpModuleInfoArray = Array of TLpModuleInfo;

т.е. массив, где каждый элемент - TLpModuleInfo - это описание процесса...ну и имеет вид:

type TLpModuleInfo = packed record
ModuleInfo:LPMODULEINFO; //Информация о процессе...в хелпе есть описание структуры...
ModulePID: Cardinal; //id процесса
ModuleName: String; //Имя додуля процесса
end;


izhalex   (2002-10-30 13:33:00) [12]

спасибо, попробую разгрести :)


Subfire   (2002-10-30 13:11:00) [13]

Короче, правда PSAPI

type TLpModuleInfo = packed record
ModuleInfo:LPMODULEINFO;
ModulePID: Cardinal;
ModuleName: String;
end;

type TLpModuleInfoArray = Array of TLpModuleInfo;

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;


function GetAllProcessesInfo(ExtractFullPath: Boolean = false):TLpModuleInfoArray;
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
//


Subfire   (2002-10-30 12:53:00) [14]

izhalex
мля...к сожалению счаз NT4 нету под рукой...дома взгляну, мож еще чего прийдет на ум =)


izhalex   (2002-10-30 11:26:00) [15]

>Subfire
За замечание большой thanx, но воз и ныне там...


Subfire   (2002-10-30 10:22:00) [16]

MBo
Ты знаешь, ничего об этом в API хэдпе не написано...поправь, если я ошибаюсь....


Subfire   (2002-10-30 10:19:00) [17]

....
ProcessList.Clear;
handler:=createtoolhelp32snapshot(TH32CS_SNAPALL,0);

FillChar(data,SizeOf(TProcessEntry32),0);
data.dwsize:=SizeOf(TProcessEntry32);
...

Хелпы, мля, читать надо лучше....
"Вызывающее приложение должно установить dwSize PROCESSENTRY32, размер этой структуры в байтах..."
Что я и делаю второй строчкой...
А первой просто зануляю структуру на всякий случай...ну параноик я =)))
И вааще, ты протрассируй процедуру и посмотри какое у тебя начальное значение data.dwsize без моих строчек...РАНДОМНОЕ и очень большое...потому что глобальные переменные инициализируются нулями а локальные имеют случайное значение!!!
Удачки.


MBo   (2002-10-30 10:07:00) [18]

под NT TollHelp32 не работает, используй PSAPI


Наверх

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