Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.16;
Скачать: CL | DM;

Вниз

получение списка процессов   Найти похожие ветки 

 
izhalex ©   (2002-10-30 09:58) [0]

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

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 :( Вопрос: что я не так делаю?


 
MBo ©   (2002-10-30 10:07) [1]

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


 
Subfire ©   (2002-10-30 10:19) [2]

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

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

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


 
Subfire ©   (2002-10-30 10:22) [3]

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


 
izhalex ©   (2002-10-30 11:26) [4]

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


 
Subfire ©   (2002-10-30 12:53) [5]

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


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

Короче, правда 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
//


 
izhalex ©   (2002-10-30 13:33) [7]

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


 
Subfire ©   (2002-10-30 15:50) [8]

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

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

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



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

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


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

>>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 в этих переменных, и выдается ошибка.


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

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

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


 
TankMan ©   (2002-10-31 18:47) [12]

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


 
Внук ©   (2002-11-01 18:37) [13]

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


 
TankMan ©   (2002-11-01 21:56) [14]

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


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

GetVersionEx


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

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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2002.12.16;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
6-51880
kostik78ua
2002-10-18 10:38
2002.12.16
TNMMsg+TNMMsgServ


14-51891
Malder
2002-10-21 22:47
2002.12.16
Начинающим программистам. Этап 1


14-51889
dkDimon
2002-11-20 16:09
2002.12.16
Delphi 7 Download


3-51568
Mad_Ghost
2002-11-27 09:44
2002.12.16
Как избавиться от диалогового окна для ввода пароля при под....


7-51984
max2057
2002-10-14 13:39
2002.12.16
Как правильно скопировать массив Byte в TMemory Stream