Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
4-97464
ledic
2002-03-28 14:45
2002.05.30
Закрытие внешней программы


1-97223
alxx
2002-05-20 15:51
2002.05.30
Выцепить Маленькую иконку из файла...


3-97213
Санёк
2002-05-10 11:48
2002.05.30
Ошибка, когда делаю backup...


3-97134
Lightning
2002-05-04 22:51
2002.05.30
Пароль на базу данных


1-97348
Kre_yurik
2002-05-20 13:17
2002.05.30
Текстовые файлы





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