Форум: "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