Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.49 MB
Время: 0.013 c
14-51882
Леший
2002-11-22 16:00
2002.12.16
Подскажите, ссылку, где есть лицензия на INTERBASE сервер


14-51915
Anatoly Podgoretsky
2002-11-24 08:56
2002.12.16
Именинники 24 ноября


1-51746
Alexei113
2002-12-03 23:05
2002.12.16
Помогите с контекстным меню...


4-52033
X-shadow
2002-11-02 16:02
2002.12.16
Ох уж этот API


1-51795
Sego
2002-12-05 09:24
2002.12.16
Отображение без gride




   Наверх