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

Вниз

Функция обратная OpenProcess???   Найти похожие ветки 

 
vidiv   (2003-03-17 14:30) [0]

Есть такой кусочек кода: "PRHandle := OpenProcess( ... ,True , PID);". Здесь по заданому ProcessID можно получить хендл на процесс. А, вот, как узнать по заданому хендлу процесса его ProcessID?
В XP точно есть функция что-то вроде GetProcessID, а в 9х нету, а мне именно для 9х и надо. Подскажи хоть куда копать..


 
vidiv   (2003-03-19 05:28) [1]

Удалено модератором
Примечание: Offtopic


 
Внук   (2003-03-19 09:23) [2]

Честно говоря, не представляю, где это может понадобиться... Прямой такой функции в API нет, насколько я знаю. Можно использовать пресловутые ToolHelp, только под Win95 не пойдет...


 
vidiv   (2003-03-19 10:03) [3]

Я написал образно OpenProcess(). На самом деле я использую функцию ShellExecuteEx(). Она позваляет получить незакрытую ручку на процесс(хендл). А вот как узнать ProcessID, ума не приложу...
Может есть какйнибудь другой способы вытянуть из ShellExecuteEx() ProcessID?

2 Модератору
что такое offtopic?


 
Внук   (2003-03-19 10:21) [4]

Я с первого раза понял :)) И все-таки - ToolHelp


 
Clickmaker   (2003-03-19 11:59) [5]

А ты используй FindExecutable + CreateProcess. Она тебе вернет ProcessID


 
Юрий Зотов   (2003-03-19 13:56) [6]

Функция, обратная OpenProcess - это CloseHandle. Именно она и выполняет обратные действия. А Вам проще использовать CreateProcess.


 
vidiv   (2003-03-20 05:43) [7]

2 Юрий Зотов
Я же вроде понятно объяснил в каком смысле обратную...

Напишите, пожалуйста, пример. Хотябы сырой, чтобы идея была ясна...


 
Digitman   (2003-03-20 09:12) [8]


> vidiv


Видишь ли, если ты имеешь хэндл процесса, то это подразумевает, что получил ты его вызовом либо OpenProcess() либо CreateProcess(). Первый вызов подразумевает наличие УЖЕ ИЗВЕСТНОГО тебе PID, второй же возвращает PID только что созданного процесса. Т.е. в обоих случаях до или после выполнения ф-ции PID известен. И непонятно, зачем предпринимать еще какие-то усилия для получения PID, если он уже тебе известен !


 
Юрий Зотов   (2003-03-20 09:32) [9]

> Напишите, пожалуйста, пример.

var
SI: TStartupInfo;
PI: TProcessInformation;
...
ZeroMemory(@SI, SizeOf(SI));
SI.cb := SizeOf(SI);
if CreateProcess(nil, "C:\Dir\Prog.exe Params", nil, nil, False, 0, nil, nil, SI, PI) then
begin
CloseHandle(PI.hThread);
... // Здесь имеем PI.hProcess и PI.dwProcessId
... // В конце не забудьте вызвать CloseHandle(PI.hProcess)
end;

Детали см. в справке по CreateProcess.


 
vidiv   (2003-03-20 14:00) [10]

2 Digitman
Я же уже сказал, что получаю его из ShellExecuteEx().

2 Юрий Зотов
Это понятно, но как быть я ярлыками, со всякими там bmp и т.д.?


 
Digitman   (2003-03-20 15:22) [11]


> vidiv


хэндл процесса (HANDLE) и хэндл экземпляра запущенного приложения (hInstance) - не одно и то же

Стартуй приложение с пом. CreateProcess() - будешь тут же иметь и хэндл его и PID


 
nikkie   (2003-03-20 16:00) [12]

>Digitman
В структуре SHELLEXECUTEINFO есть поле HANDLE hProcess. Так что действительно, есть возможность получить хендл процесса, не зная ничего о его PID.

> vidiv
У тебя есть причины не использовать CreateProcess? Народ здесь часто советует использовать ShellExecute для того, чтобы запустить exe, что, имхо, неправильно с точки зрения идеологии. Тебе действительно нужно открывать файлы по ассоциациям?

Простого метода получения PID по хендл процесса я не вижу. Наверняка можно придумать вариант с выполнением GetCurrentProcessId в контексте нужного процесса. Но хотелось бы понимать, зачем такие сложности.

Кстати, документация говорит про ShellExecuteEx, что если новый процесс не стартуется, то hProcess не будет заполнен. Так что имей это ввиду. Может ты расскажешь, что ты делаешь и найдется более простое решение?



 
Digitman   (2003-03-20 16:20) [13]


> nikkie


Ну тогда - ToolHelp в руки и - вперед !


 
nikkie   (2003-03-20 17:00) [14]

>Digitman
А чем ToolHelp поможет-то? Как определить, что некоторый PID - это PID именно того процесса, от которого у меня есть хендл?


 
Игорь Шевченко   (2003-03-20 17:23) [15]

Вопрос к автору: а зачем он нужен, PID-то этот ?


 
Юрий Зотов   (2003-03-20 19:56) [16]

> vidiv © (20.03.03 14:00)
> как быть я ярлыками, со всякими там bmp и т.д.?

FindExecutable + CreateProcess. У меня большое подозрение, что ShellExecute именно так и работает.


 
nikkie   (2003-03-20 20:32) [17]

>Юрий Зотов
Думаю не все так просто.
1. При выполнении ShellExecute новый процесс может и не создаваться.
2. Ассоциации могут использовать DDE для открытия файла.


 
vidiv   (2003-03-21 06:28) [18]

>>> Игорю Шевченко и всем...
Пишу программу для игрового клуба, которая заменяет стандартный shell. Только не подумайте что сам полноценный shell пишу. Вот. При запуске моя программа делает снимок процессов и сохраняет их PIDы в массив. Потом при запуске какой либо игры из моей программы (именно сдесь я и использую ShellExecuteEx), программа должна сохранить получный PID в другой массив. Затем программа моя время от времени делает еще снимок, и проверяет наличие тех процессов, которых нет в обоих списках. Если эти процессы есть, то моя программа их убивает.
Недавно я пересмотрел что может делать ToolHelp и обнаружил, что она может показать и процесса-родителя. Т.е. второй список (список запущеных процессов из мой программы) можно составить из процессов чьим родителем является моя программа.

Вроде бы все, но остался всетаки интерес. Неужеле невозможно найти PID по хендлу в win9x?


 
Digitman   (2003-03-21 09:05) [19]


> nikkie


Логично. Процессов одного и того же приложения м.б. более одного.


> vidiv


Думаю, копаешь ты не туда.
Задача, наверно, д.б. поставлена так - ограничить (по неким условиям) на машине пользователя возможность старта процесса того или иного приложения (а не "прибивать" уже стартованный процесс, коль скоро он будет обнаружен).
Для этого на целевой машине должен работать некий "скрытый" процесс (с системными и/или административными привелегиями доступа), который будет перехватывать вызовы Win32API-ф-ций, осуществляющих старт нового процесса (как минимум, CreateProcess[Ex]), и возвращать сист.код отказа в случае соблюдения заданных нежелательных условий. Причем такой перехват должен осуществляться для всех процессов (как уже работающих, так и потенциально стартующих в будущем), которые используют (хотя бы в документированном объеме) библ-ку ядра kernel32 в части вызова из нее ф-ций, относящихся к старту нового процесса (та же CreateProcess[Ex])


 
Evgeny V   (2003-03-21 09:42) [20]

Посмотри GetWindowThreadProcessId






 
vidiv   (2003-03-23 15:17) [21]

> Digitman © (21.03.03 09:05)
Эта задача для меня слишком сложна. Читал статью сдесь про перехват, но почти ничего не понял... Если вы готовы помоч я буду только рад...

> Evgeny V © (21.03.03 09:42)
Евгений, насколько я знаю, эта функция позваляет получить PID которому принадлежит некоторое окно...


 
ГОГА   (2003-03-23 17:20) [22]

http://www.rsdn.ru/qna/default.asp?baseserv/killapp.xml


 
Digitman   (2003-03-24 08:53) [23]


> vidiv


скачай себе исходники системы удаленного администрирования BackOrifice и изучи от и до.

там как раз используются механизмы перехвата и собственной загрузки библиотек.
только не говори, что C-текст для тебя - темный лес.


 
vidiv   (2003-03-24 12:24) [24]

> Digitman © (24.03.03 08:53)

Темный...:) Но вообще если на WinApi то разобратся можно...

Найти бы еще эти исходники... Не подскажешь ссылку?


 
Игорь Шевченко   (2003-03-24 12:26) [25]

vidiv © (24.03.03 12:24)

Ссылка на Sourceforge (www.sourceforge.net) Но исходники там достаточно непростые.



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

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

Наверх





Память: 0.5 MB
Время: 0.006 c
1-70238
boroda
2003-05-11 17:25
2003.05.22
TListView & TTreeView в одном.


3-70152
Cherry85
2003-04-30 14:47
2003.05.22
Rave Reports


14-70519
KSergey
2003-05-01 12:00
2003.05.22
Изображения TIFF и JPEG


1-70349
Officeman
2003-05-09 12:44
2003.05.22
Как реализовать подгрузку формул из файла?


7-70549
Umar
2003-03-21 18:31
2003.05.22
Функция DeviceloControl





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