![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запущен ли процесс? И если да как получить его Handle [D6, Win95/98, WinME, Win2k, WinXP]
Ogu © (2002-03-26 23:37:00)Мне требуется: узнать, запущен ли процесс или нет?
Если процесс запущен, то делаю 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-29 07:30:00) [1]>начиная с w2k toolhelp api поддерживается.
Thanks, не знал.
paul_shmakov (2002-03-28 22:44:00) [2]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.
ogu (2002-03-27 10:18:00) [3]Да я с тобой согласен, попробую сделать примерно такую же функцию с помощью PSAPI, я вчера по форуму покопался - пару раз встречалось подобное.
MBo (2002-03-27 00:55:00) [4]под NT-семейством Toolhelp32 не работает, надо PSAPI использовать. см. главу 14 Тексейра-Пачеко на delphi.vitpc.com
может и в форуме примеры есть
ogu (2002-03-26 23:55:00) [5]Вообще под XP, но желательно чтоб работала и на 98.
MBo (2002-03-26 23:47:00) [6]для какой Windows?