Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-45301
Lexer
2002-10-04 16:20
2002.10.14
Объединение ячеек


1-45447
Th
2002-10-03 18:05
2002.10.14
Перенос слов в TLabel.Caption


1-45364
Эльф
2002-10-06 12:02
2002.10.14
Менюшки в стиле OfficeXP


14-45537
ВОВКА
2002-09-19 21:03
2002.10.14
Огромная просьба


1-45383
Forever
2002-10-01 14:37
2002.10.14
как преобразовать PChar в string





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский