Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить Processid вызвав ShellExecuteEx? не путать с HProcess 
:(
    Опции темы
leniviy
  Дата 8.10.2004, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



Ну никак не могу найти
PM MAIL   Вверх
Step
Дата 8.10.2004, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



ИМХО GetSecurityInfo


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
p0s0l
Дата 8.10.2004, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



idProcess = GetProcessId ( hProcess ); - эта функция только в WinXP/2k3!

Способ для всех NT-вындов: как сказал Step, только я честно говоря не знаю как это делается... Было бы познавательно узнать...

Способ для всех 9x/NT виндов:
делаешь CreateToolhelp32Snapshot, циклом Process32First / Process32Next, тем самым получая PID всех процессов, открываешь их, и смотришь, тот ли это процесс. Например, через GetProcessTimes можно узнать время создания (два процесса не могут иметь в точности одинаковое время создания...)...

В Си не прогаю, но примерно будет так:
Код

 ShellExecuteEx ( &sei );

 FILETIME time1, time2, tmp;
 GetProcessTimes( sei.hProcess, time1, tmp, tmp, tmp );
 HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
 PROCESSENTRY32 pe32.dwSize = sizeof( pe32 );
 if Process32First( hSnapshot, &pe32 )
 {
    do
    {
     HANDLE hProcess1 = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, pe32.th32ProcessID );
     GetProcessTimes( hProcess1, time2, tmp, tmp, tmp );
     CloseHandle( hProcess1 );
     if( (time1.dwLowDateTime == time2.dwLowDateTime)&&( time1.dwHighDateTime == time2.dwHighDateTime ) ) then Break;
     } while( Process32Next( hSnapshot, pe32 ) );
 }
 CloseHandle( hSnapshot );

// в pe32.th32ProcessID содержится ID процесса
С циклами, наверное, фигню спорол, но главное - смысл...



--------------------
С уважением, г-н Посол.
PM   Вверх
Step
Дата 8.10.2004, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



Цитата(p0s0l @ 8.10.2004, 17:11)
Способ для всех 9x/NT виндов: делаешь CreateToolhelp32Snapshot, циклом Process32First / Process32Next, тем самым получая PID всех процессов, открываешь их, и смотришь, тот ли это процесс. Например, через GetProcessTimes можно узнать время создания (два процесса не могут иметь в точности одинаковое время создания...)...

все правильно можно и так
Цитата(p0s0l @ 8.10.2004, 17:11)
HANDLE hProcess1 = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, pe32.th32ProcessID );

тут просто нужно сравнить с хендлом который получил и выйти когад совподет
Цитата(p0s0l @ 8.10.2004, 17:11)
Было бы познавательно узнать...

я этого не делал, но порядок примерно такой
в ShellExecuteEx передаеться указатель на структуру после выполнения поля структуры меняються
получаем хендл и вызываем GetSecurityInfo
в которую передаюеться хендл настрока запрашываемого объекта и указатели

и по выполнению получаем сид
Добавлено @ 17:24
Цитата(p0s0l @ 8.10.2004, 17:11)
dProcess = GetProcessId ( hProcess ); - эта функция только в WinXP/2k3!

а вот это для меня было новостью... к сожелению доки не нашел в МСДН


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
p0s0l
Дата 8.10.2004, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Цитата
тут просто нужно сравнить с хендлом который получил и выйти когад совподет
Хм... у меня не совпадают... С какими параметрами надо вызывать OpenProcess, чтобы получить такой же хэндл ?
Я в цикле перебрал все возможные права доступа в OpenProcess, начиная от 0 до 0xFFFF (аж с запасом), с TRUE и FALSE в качестве параметра bInheritHandle, - и всё равно не получается такого же точно хэндла...

Цитата
и по выполнению получаем сид
А дальше ? Что делать с SID'ом ? Извини, если торможу... Как перевести SID -> PID ?

Цитата
а вот это для меня было новостью... к сожелению доки не нашел в МСДН

Вот из MSDN:
Цитата
The GetProcessId function retrieves the process identifier of the specified process.

void GetProcessId(
  HANDLE Process
);

Parameters
Process
[in] Handle to the process. The handle must have the PROCESS_QUERY_INFORMATION access right. For more information, see Process Security and Access Rights.
Return Values
If the function succeeds, the return value is the process identifier of the specified process.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks
Until a process terminates, its process identifier uniquely identifies it on the system.

Requirements
Client: Included in Windows XP SP1.
Server: Included in Windows .NET Server 2003.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.



--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0436 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.