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

Вниз

Запущен ли процесс? И если да как получить его Handle   Найти похожие ветки 

 
Ogu   (2002-03-26 23:37) [0]

Мне требуется: узнать, запущен ли процесс или нет?
Если процесс запущен, то делаю SetForegroundWindow(Handle).
Hanle ловлю следующей функцией:

function ProcessExists(const FileName:string):THandle;
var h:THandle;
pe:PROCESSENTRY32;
begin
h:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize:=SizeOf(pe);
if Process32First(h,pe)then
repeat
if StrIComp(pe.szExeFile,PChar(FileName))=0 then
begin
result:=OpenProcess(PROCESS_ALL_ACCESS,true,pe.th32ProcessID);
CloseHandle(h);
exit;
end;
until not Process32Next(h,pe);
CloseHandle(h);
end;
Но если её запустить несколько раз, она дает каждый раз разный Handle и к тому же неправильный. В чем дело? И если кто знает другие пути получения Handle процесса по его имени файла(класс и заголовок неизвестны), то просьба поделится.


 
MBo   (2002-03-26 23:47) [1]

для какой Windows?


 
ogu   (2002-03-26 23:55) [2]

Вообще под XP, но желательно чтоб работала и на 98.


 
MBo   (2002-03-27 00:55) [3]

под NT-семейством Toolhelp32 не работает, надо PSAPI использовать. см. главу 14 Тексейра-Пачеко на delphi.vitpc.com
может и в форуме примеры есть


 
ogu   (2002-03-27 10:18) [4]

Да я с тобой согласен, попробую сделать примерно такую же функцию с помощью PSAPI, я вчера по форуму покопался - пару раз встречалось подобное.


 
paul_shmakov   (2002-03-28 22:44) [5]

2 MBo:
"под NT-семейством Toolhelp32 не работает, надо PSAPI использовать"
если под nt-семейством понимается и w2k, и xp, то утверждение ложно. начиная с w2k toolhelp api поддерживается.
а человек про xp спрашивает.

2 ogu:
для начала следует Result обнулить, чтобы предусмотреть случай, когда процесс не найден.

function ProcessExists(const FileName: string): THandle;
var
h: THandle;
pe: PROCESSENTRY32;
begin
Result := 0;
h := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if h <> -1 then
try
pe.dwSize := SizeOf(pe);
if Process32First(h, pe) then
repeat
if StrIComp(pe.szExeFile, PChar(FileName)) = 0 then
begin
Result := OpenProcess(PROCESS_ALL_ACCESS, true, pe.th32ProcessID);
Break;
end;
until not Process32Next(h,pe);
finally
CloseHandle(h);
end;
end;

ну а то, что функция возвращает разные значения handle при нескольких вызовах - это нормально. handle - это не идентификатор процесса, это всего лишь некий дескриптор, который позволяет текущему процессу как-то обратиться к объекту ядра (в данном случае чужому процессу).
так что OpenProcess вполне имеет право возвращать разные значения THandle. Главное не забывать делать им потом CloseHandle.


 
MBo   (2002-03-29 07:30) [6]

>начиная с w2k toolhelp api поддерживается.
Thanks, не знал.



Страницы: 1 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.013 c
3-97112
Cola
2002-05-04 21:39
2002.05.30
DBGridEH


3-97152
Juddit
2002-05-06 17:28
2002.05.30
Append from...


7-97445
sj
2002-03-01 18:22
2002.05.30
Формирование ресурсов сообщений


14-97427
Дмитрий_Б
2002-04-19 17:46
2002.05.30
Вопрос о разных модулях памяти


3-97187
DmitryM
2002-05-07 12:18
2002.05.30
Выгрузка данных из Blob-поля