Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.012 c
3-51568
Mad_Ghost
2002-11-27 09:44
2002.12.16
Как избавиться от диалогового окна для ввода пароля при под....


14-51885
time2cru$h
2002-11-23 11:44
2002.12.16
тема


14-51961
Xsid
2002-11-26 04:24
2002.12.16
360 кб для exe-шника?


14-51888
Ajax
2002-11-21 16:50
2002.12.16
Программа для компьютерного клуба.


14-51965
VictorT
2002-11-26 21:56
2002.12.16
Предзагрузка - хорошо или плохо?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский