Форум: "WinAPI";
Текущий архив: 2002.10.14;
Скачать: [xml.tar.bz2];
ВнизПоиск заданного процесса Найти похожие ветки
← →
Константин (2002-08-28 10:33) [0]Мне необходимо убедиться что определенное приложение не запушено. Использовать GetWindow я не могу т.к. данное приложение не имеет постоянно существующих окон.
Остается искать по запущенным процессам сравнивая ExeName.
В FAQ я нашел следуюшую процедуру:
procedure GetProcessList(List: TStrings);
var
I: Integer;
hSnapshoot: THandle;
pe32: TProcessEntry32;
begin
List.Clear;
hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshoot = -1) then
Exit;
pe32.dwSize := SizeOf(TProcessEntry32);
if (Process32First(hSnapshoot, pe32)) then
repeat
I := List.Add(Format("%x, %x: %s",
[pe32.th32ProcessID, pe32.th32ParentProcessID, pe32.szExeFile]));
List.Objects[I] := Pointer(pe32.th32ProcessID);
until not Process32Next(hSnapshoot, pe32);
CloseHandle (hSnapshoot);
end;
Но данная процедура не возвращает ни одного процесса! :=(
Подскажите плиз в чем косяк?
← →
Ученик (2002-08-28 11:25) [1]На NT4 не поддерживается CreateToolhelp32Snapshot
← →
Константин (2002-08-29 01:57) [2]Извечный вопрос - "И что же мне тогда делать?"!
← →
Gluka (2002-08-29 02:29) [3]Берешь в руки PSAPI(1) и тянешь с неё вот что:
- EnumProcesses
- EnumProcessModules
- GetModuleFileNameExA ()
- GetModuleFileNameExW ()
- GetModuleInformation
в хелпе ето есть, описано если нет то найдешь
Или можно через NTQuerySystemInformation....
в хелпе ето есть, описано если нет то найдешь
думаю этого хватит
← →
Константин (2002-08-29 05:21) [4]Порылся получилась универсальная для 95 и NT процедура...
Для 95 работает, а вот для NT нет. Почему-то EnumProcesses
всегда возвращаен False! Может надо для пользователя от которого запускается приложения давать какие то права?
Текст процедуры:
uses TlHelp32, PSAPI;
procedure GetProcessList(sl:TStrings);
var
pe:TProcessEntry32;
ph, snap:THandle;//
← →
Aleksey Pavlov (2002-08-29 10:43) [5]Для того что бы убедиться, что некая программа выполняется есть много способов.
Классический и наиболее "правильный", на мой взгляд, это использование NTQuerySystemInformation для Win2000 и Toolhelp для Win9x.
Но, если Вам не хочется с ними связываться, то, зная exe-файл из которого запускается интересующий Вас процесс, просто попробуйте открыть его
из своей программы на полный доступ (или просто на запись). Если эта попытка закончится сообщением об отказе в доступе, связанным с тем, что
данный объект уже используется системой, то очевидно, что программа запущена.
Хотя, я бы не стал полагаться на данный метод, так что советую воспользоваться "классикой".
← →
Ученик (2002-08-29 10:45) [6]>Aleksey Pavlov © (29.08.02 10:43)
На всякий случай, ToolHelp поддерживается для Windows 2000
← →
Aleksey Pavlov (2002-08-29 11:09) [7]>>Ученик © (29.08.02 10:45):
Не стал бы на него полагаться.
При использовании ф-ии CreateToolHelp32Snapshot и дальнейшей работой с возвращаемыми результатами было замечено, что
названия некоторых процессов не выводятся корректно, проще говоря, получаем "мусор".
Т.е. моя программа, корректно работающая на Win9x не пригодна для Win2000. Работая же с NTQuerySystemInformation вышеописанные "косяки" не встречались.
← →
Ученик (2002-08-29 11:12) [8]>Aleksey Pavlov © (29.08.02 11:09)
:-)
← →
Константин (2002-08-30 03:50) [9]Спасибо всем кто откликнулся на мой вопрос!
Проблему решил (покопаться пришлось правда) вот работающая процедура для win 95, nt. 2000.(Мож кому сгодится):
uses TlHelp32;
procedure GetProcessList(sl:TStrings);
type
PThreadInfo = ^TThreadInfo;
TThreadInfo = record
ftCreationTime : TDateTime ;
dwUnknown1 : DWORD ;
dwStartAddress : DWORD ;
dwOwningPID : DWORD ;
dwThreadID : DWORD ;
dwCurrentPriority : DWORD ;
dwBasePriority : DWORD ;
dwContextSwitches : DWORD ;
dwThreadState : DWORD ;
dwUnknown2 : DWORD ;
dwUnknown3 : DWORD ;
dwUnknown4 : DWORD ;
dwUnknown5 : DWORD ;
dwUnknown6 : DWORD ;
dwUnknown7 : DWORD ;
end;
PProcessInfo = ^TProcessInfo;
TProcessInfo = record
dwOffset : DWORD ;
dwThreadCount : DWORD ;
dwUnkown1 : array [1..6] of DWORD ;
ftCreationTime : TDateTime ;
dwUnkown2 : DWORD ;
dwUnkown3 : DWORD ;
dwUnkown4 : DWORD ;
dwUnkown5 : DWORD ;
dwUnkown6 : DWORD ;
pszProcessName : PWideChar ;
dwBasePriority : DWORD ;
dwProcessID : DWORD ;
dwParentProcessID : DWORD ;
dwHandleCount : DWORD ;
dwUnkown7 : DWORD ;
dwUnkown8 : DWORD ;
dwVirtualBytesPeak : DWORD ;
dwVirtualBytes : DWORD ;
dwPageFaults : DWORD ;
dwWorkingSetPeak : DWORD ;
dwWorkingSet : DWORD ;
dwUnkown9 : DWORD ;
dwPagedPool : DWORD ;
dwUnkown10 : DWORD ;
dwNonPagedPool : DWORD ;
dwPageFileBytesPeak : DWORD ;
dwPageFileBytes : DWORD ;
dwPrivateBytes : DWORD ;
dwUnkown11 : DWORD ;
dwUnkown12 : DWORD ;
dwUnkown13 : DWORD ;
dwUnkown14 : DWORD ;
ati : array [1..1] of TThreadInfo ;
end;
TNtQSI = function(Nmb: integer; Ptr: Pointer; Size1, Size2: integer): DWORD; stdcall;
var
pe : TProcessEntry32 ;
snap : THandle ;
NtQSI : TNtQSI ;
Buf : array [1..20480] of char ;
PrcInfo : PProcessInfo ;
hLib : DWORD ;
Ptr : Pointer ;
Cur : DWORD ;
tmpStr : String ;
begin
sl.Clear;
if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then begin //
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.10.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c