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

Вниз

Поиск заданного процесса   Найти похожие ветки 

 
Константин   (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 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.021 c
1-45376
lety
2002-10-04 00:11
2002.10.14
таблица с заголовком в 2 уровня


1-45330
Karbo
2002-10-05 14:46
2002.10.14
Есть ли в delphi 3 -delphi 5 компонент TValueListEditor ?


3-45210
stub
2002-09-23 13:22
2002.10.14
sql запрос по выбору записи содержащей русские символы не пашет


1-45263
Осирис
2002-10-03 14:46
2002.10.14
TaskBar


1-45388
Семенов Дмитрий
2002-10-02 18:10
2002.10.14
Перерисовка элементов формы после Resize а