Форум: "WinAPI";
Текущий архив: 2002.05.30;
Скачать: [xml.tar.bz2];
ВнизЗапущен ли процесс? И если да как получить его 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.05.30;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.005 c