Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];

Вниз

Как узнать ID процесса по его handle?   Найти похожие ветки 

 
Li_   (2004-02-11 09:48) [0]

Мастера, подскажите, пожалуйста, как получить ID просесса, если у нас есть его handle?


 
BiN ©   (2004-02-11 09:59) [1]

а откуда ты берешь этот хэндл, позволь спросить


 
Unax ©   (2004-02-11 10:22) [2]

Если имя процесса не извесно, то
1. Определяем имя с помощью GetModuleFileName
2. С помощью ф-й  CreateToolhelp32Snapshot() и Process32First(), Process32Next() ищешь процесс с твоим имене, а там в структуре PROCESSENTRY32 есть поле ID процесса.

Геморный способ конечно, но другого не знаю.


 
BiN ©   (2004-02-11 10:37) [3]

>>Unax ©   (11.02.04 10:22) [2]
1 Данная функция не определит имя образа чужого процесса (тогда уж лучше GetModuleFileNameEx)
2. Но даже получение имени не приводит к желаемому результату в случае, если таких процессов несколько


 
Unax ©   (2004-02-11 11:11) [4]

>>BiN
Согласен, но как я уже сказал, другого способа не знаю.


 
Unax ©   (2004-02-11 11:14) [5]

Интересно а на фига вообще ID если есть хэндл?


 
AKul ©   (2004-02-11 12:09) [6]

> Unax ©   (11.02.04 11:14) [5]
> Интересно а на фига вообще ID если есть хэндл?

ID уникален во всей системе.
Handle процесса уникален только внутри процесса.
Кроме того, функция OpenProcess, например, требует идентификатор процесса, а не его Handle.


> Li_   (11.02.04 09:48)  

Если Вы каким-то образом получили действительный в Вашем процессе Handle, то таким же способом и получайте его ID


 
Игорь Шевченко ©   (2004-02-11 12:16) [7]


> Handle процесса уникален только внутри процесса.


Бред.


 
Li_   (2004-02-11 12:35) [8]

Хендл я получил очень просто:
H:=FindWindow("SciCalc","Калькулятор");

Unax"у хотелсь бы сказать, что буду пробовать, конечно, но хотелось бы примерчик. Спасибо.


 
Игорь Шевченко ©   (2004-02-11 12:40) [9]

Li_   (11.02.04 12:35)


> Хендл я получил очень просто:
> H:=FindWindow("SciCalc","Калькулятор");


Это Handle окна, а не процесса.
Получить из него ID процесса можно функцией GetWindowThreadProcessID


 
AKul ©   (2004-02-11 12:47) [10]


> Игорь Шевченко ©   (11.02.04 12:16) [7]
> > Handle процесса уникален только внутри процесса.
> Бред.


Это почему же бред?????

Или Вы хотите сказать, что если передать Handle в какой-нибудь другой процесс без дублирования и наследования он будет там действителен??? - Нет.
Или Вы хотите сказать что при дублировании и наследовании его значения в разных процессах  будут одинаковы??? - Тоже нет.
Может Вы хотите сказать, что несколько раз вызвав функцию CreateProcess в одном процессе, можно получить два одинаковых Handle"а, пока процессы не были завершены??? - Тем более нет.

По-моему, Ваше замечание похоже бред.

Если я не прав, то исправьте меня.


 
Li_   (2004-02-11 12:54) [11]

Игорю Шевченко
а почему GetWindowThreadProcessID выдает ошибку
Я пишу:
var
 PIDl: LPDWORD;
 PidZ: DWORD;
 H1: HWND;
begin
H1:=FindWindow("SciCalc","Калькулятор");
PidZ:=GetWindowThreadProcessId(H1,PIDl);
end;
Что не правильно?


 
AKul ©   (2004-02-11 13:03) [12]


> Li_   (11.02.04 12:54) [11]
> а почему GetWindowThreadProcessID выдает ошибку
> Я пишу:
> var
>  PIDl: LPDWORD;
>  PidZ: DWORD;
>  H1: HWND;
> begin
> H1:=FindWindow("SciCalc","Калькулятор");
> PidZ:=GetWindowThreadProcessId(H1,PIDl);
> end;
> Что не правильно?


Сделайте так:
> var
>  IDl: DWORD;
>  PidZ: DWORD;
>  H1: HWND;
> begin
> H1:=FindWindow("SciCalc","Калькулятор");
> PidZ:=GetWindowThreadProcessId(H1,@IDl);
> end;


 
AKul ©   (2004-02-11 14:25) [13]

Маленькая поправочка.

> AKul ©   (11.02.04 12:47) [10]
....
> Или Вы хотите сказать что при дублировании и наследовании
> его значения в разных процессах  будут одинаковы??? - Тоже
> нет.
....


В этом предложении ([10]) фраза  "дублировании и наследовании" попала из предыдущего предложения при копировании, на что я сам не обратил внимание. А при наследовании (но не при дублировании) Handle"ы (наследуемые) в родительском и дочернем процессе будут идентичны.
Странно, что на это никто не обратил внимание.

Игорь Шевченко [7], но ведь и это не нарушает мою фразу на счет уникальности Handle"а только внутри процесса. Наследование Handle"ов - это копирование таблицы Handle"ов в дочерний процесс, а не получение Handle"а путем создания идентичного объекта (Вы даже не создаете объекты в дочернем процессе, они были созданны в родительском).

Самый простой пример противоречащий Вашему замечанию в [7] (если можно так выразиться) - создайте мьтекс в одном процессе (CreateMutex), затем откройте его же в другом процессе(OpenMutex или CreateMutex) и сравните возвращаемые Handle"ы. Если бы Handle"ы были уникальны не только внутри процесса, то Handle были бы идентичными. Но ведь это не так!
То же самое и с созданием процесса - функция OpenProcess вернет совсем другой Handle, отличный от возвращенного функцией CreateProcess в другом процессе. А если передать в другой процесс Handle без дублирования и наследования, то думаю не стоит повторять, что он будет недействительным.


 
Игорь Шевченко ©   (2004-02-11 14:33) [14]

AKul ©   (11.02.04 12:47)


> Или Вы хотите сказать, что если передать Handle в какой-нибудь
> другой процесс без дублирования и наследования он будет
> там действителен??? - Нет.


Handle вашего процесса для вас всегда равен -1 (GetCurrentProcess).

DuplicateHandle для Handle объектов типа "процесс" нужен для учета ссылок на объект "Процесс". Кстати, OpenProcess, кроме получения Handle увеличивает количество ссылок на объект "процесс".

Объекты "Процесс" в системе идентифицируются двумя однозначными способами - по ID и по Handle. Handle каждого процесса уникален в системе.

Для того, чтобы убедиться в этом, можно запустить Process Explorer Руссиновича и Когсуэелла. (www.sysinternals.com)

С уважением,


 
Li_   (2004-02-11 15:14) [15]

Спасибо AKul"у.
> var
>  IDl: DWORD;
>  PidZ: DWORD;
>  H1: HWND;
> begin
> H1:=FindWindow("SciCalc","Калькулятор");
> PidZ:=GetWindowThreadProcessId(H1,@IDl);
> end;

заработало, но выдает какой-то савсем другой ID чем мой процесс вьювер (procviewver из примеров для ВСВ6). Что это за процесс ловится, если не калькуляторный?


 
Игорь Шевченко ©   (2004-02-11 15:22) [16]

AKul ©   (11.02.04 14:25)


> То же самое и с созданием процесса - функция OpenProcess
> вернет совсем другой Handle, отличный от возвращенного функцией
> CreateProcess в другом процессе.


Пробовали ?


 
AKul ©   (2004-02-11 16:33) [17]


> Игорь Шевченко ©   (11.02.04 14:33) [14]
> DuplicateHandle для Handle объектов типа "процесс" нужен
> для учета ссылок на объект "Процесс". Кстати, OpenProcess,
> кроме получения Handle увеличивает количество ссылок на
> объект "процесс".


OpenProcess действительно увеличивает счетчик ссылок на объект ядра "процесс" на 1. Так же это делает и DuplicateHandle и все подобные функции. То же самое происходит и при наследовании Handle"ов дочерним процессом.

Handle - это всего лишь индекс в таблице описателей процесса, которая для каждого процесса своя.

Да и кроме того, как Вы думаете, зачем функция DuplicateHandle
имеет такой параметр, как lpTargetHandle (указатель на переменную под продублированный Handle для другого процесса)? Ведь если бы Handle был уникален во всей системе, то зачем тогда этот параметр - тогда бы Вы просто передавали в другой процесс оригинальный Handle (не продублированный)?? Да и зачем тогда этой функции Handle другого процесса, да и оригинального??? Ведь, если бы Handle был уникальным во всей системе, то достаточно было бы передать только его значение.


> Объекты "Процесс" в системе идентифицируются двумя однозначными
> способами - по ID и по Handle. Handle каждого процесса уникален
> в системе.


Нет! Во всей системе - только по идентификатору!!! (ID).

Handle - это всего лишь индекс в таблице описателей процесса, которая для каждого процесса своя.


> Игорь Шевченко ©   (11.02.04 15:22) [16]
> Пробовали ?

Да! Попробовал! Вы меня вынудили!
Советую и Вам попробовать хотя бы для одного процесса, например, так:

......
// Получили ID нужного процесса
Hnd1:=OpenProcess(PROCESS_ALL_ACCESS,false,ID);
ShowMessage(IntToStr(Hnd1));
Hnd2:=OpenProcess(PROCESS_ALL_ACCESS,false,ID);
ShowMessage(IntToStr(Hnd2));
//Закрываем все Handle"ы
......

Как Вам это не покажется странным, но Hnd1 и Hnd2 будут разные!

С уважением, Андрей


 
AKul ©   (2004-02-11 16:46) [18]


> Li_   (11.02.04 15:14) [15]
> > PidZ:=GetWindowThreadProcessId(H1,@IDl);
> заработало, но выдает какой-то савсем другой ID чем мой
> процесс вьювер (procviewver из примеров для ВСВ6). Что это
> за процесс ловится, если не калькуляторный?

Я не смотрел этот пример в C++ Builder"e и не знаю что он выдает.
Возможно Вы анализируете переменную PidZ (идентификатор потока) вместо IDl (идентификатор процесса).
Может этот пример выводит идентификаторы в шестнадцатеричной системе счисления.
Сравнивайте со значением в диспетчере задач (Ctrl + Alt + Del).

P.S. Попробовал у себя на машине: все работает IDl = значению в диспетчере задач.


 
Игорь Шевченко ©   (2004-02-11 16:55) [19]

AKul ©   (11.02.04 16:33)


> Handle - это всего лишь индекс в таблице описателей процесса,
> которая для каждого процесса своя.


Приношу свои извинения, вот эту фразу я и забыл. Вы абсолютно правы.

Особенно извиняюсь за Игорь Шевченко ©   (11.02.04 12:16) [7]

С уважением,


 
AKul ©   (2004-02-11 17:05) [20]


> Игорь Шевченко ©   (11.02.04 16:55) [19]

ОК. Извинения приняты. Все нехорошее забыто...


 
ai   (2004-02-12 08:00) [21]

> AKul, Игорь Шевченко

в продолжение разговора хотел бы обратить ваше внимание на вопрос "Программное "нажатие" клавиши в другом приложении".
Заранее благодарен.



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

Форум: "WinAPI";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.032 c
1-1080473614
Dzhon
2004-03-28 15:33
2004.04.18
Как создать глобальный обработчик?


14-1080030833
Nikolay M.
2004-03-23 11:33
2004.04.18
Чем компьютер похож на мужчину :)


14-1079953574
ghg
2004-03-22 14:06
2004.04.18
iriver-550 и sorell smp-t13


1-1080932509
xandro
2004-04-02 23:01
2004.04.18
Бегущая строка: Как убрать текст выведенный с помощью tetxtout


14-1080029594
Volodya_
2004-03-23 11:13
2004.04.18
Почтовый клиент





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