ShellExecuteEx
От: Small  
Дата: 06.08.02 14:40
Оценка:
Уважаемые, ситуация заключается в следующем.

С помощью функции ShellExecuteEx запускаю некоторое приложение или открываю документ.
Как Вы знаете эта функция возвращает в передаваемой ей структуре SHELLEXECUTEINFO хендл процесса.

Не подскажите ли как я могу получить идентификатор запущенного мною процесса? То есть проблема
более общая как по хендлу процесса получить его идентификатор в пользовательском режиме?

Прошу не предлагать варианты получения идентификатора по имени запускаемого процесса (приходится
открывать и документы, к тому же может быть запущено несколько приложений с тем же именем ).
Функция CreateProcess тоже не подойдет.
Re: ShellExecuteEx
От: Mink Россия  
Дата: 06.08.02 15:06
Оценка:
Здравствуйте Small, Вы писали:

S>Уважаемые, ситуация заключается в следующем.


S>С помощью функции ShellExecuteEx запускаю некоторое приложение или открываю документ.

S>Как Вы знаете эта функция возвращает в передаваемой ей структуре SHELLEXECUTEINFO хендл процесса.

S> Не подскажите ли как я могу получить идентификатор запущенного мною процесса? То есть проблема

S>более общая как по хендлу процесса получить его идентификатор в пользовательском режиме?

S>Прошу не предлагать варианты получения идентификатора по имени запускаемого процесса (приходится

S>открывать и документы, к тому же может быть запущено несколько приложений с тем же именем ).
S>Функция CreateProcess тоже не подойдет.

Используй PSAPI или ToolHelp функции. Но даже с ними напрямую, похоже, не получится, придется перебирать все процессы в системе и сравнивать имеющийся хэндл.
Сила, она в ньютонах
Re[2]: ShellExecuteEx
От: Small  
Дата: 06.08.02 15:19
Оценка:
Здравствуйте Mink, Вы писали:

M>Используй PSAPI или ToolHelp функции. Но даже с ними напрямую, похоже, не получится, придется перебирать все процессы в системе и сравнивать имеющийся хэндл.


Такую гадость я никогда в жизни использовать не буду — для этого требуются отдельные dll-ки + это совершенно бесполезно. В конечном счете все они полуают информацию о запущенных процессах с помощью функции NtQueryDirectorySystemInformation с классом информации 5. Но она не возвращает информации о хендлах процессов, так как иони имеют значение только для конкретного процесса. NtQueryDirectorySystemInformation возвращает только общезначимую для системы информацию.

Значит и предлдагаемые тобой функции не возвращают нужной мне информации (ToolHelp — я проверил )
Re[3]: ShellExecuteEx
От: Mink Россия  
Дата: 06.08.02 15:33
Оценка:
Здравствуйте Small, Вы писали:

S>Здравствуйте Mink, Вы писали:


M>>Используй PSAPI или ToolHelp функции. Но даже с ними напрямую, похоже, не получится, придется перебирать все процессы в системе и сравнивать имеющийся хэндл.


S>Такую гадость я никогда в жизни использовать не буду — для этого требуются отдельные dll-ки + это совершенно бесполезно. В конечном счете все они полуают информацию о запущенных процессах с помощью функции NtQueryDirectorySystemInformation с классом информации 5. Но она не возвращает информации о хендлах процессов, так как иони имеют значение только для конкретного процесса. NtQueryDirectorySystemInformation возвращает только общезначимую для системы информацию.


S>Значит и предлдагаемые тобой функции не возвращают нужной мне информации (ToolHelp — я проверил )


Я имел в виду следующий способ


DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        return;

    // Calculate how many process identifiers were returned.

    cProcesses = cbNeeded / sizeof(DWORD);

    // Print the name and process identifier for each process.

    for( i = 0; i < cProcesses; i++ )
      {
         HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ,
                                   FALSE, aProcesses[i]));                
        if(ТвойХэндл ==  hProc)
          {
           //do something
          }
        else
          CloseHandle(hProc);
      }
Сила, она в ньютонах
Re[3]: ShellExecuteEx
От: vasketsov Россия http://ntprog.by.ru
Дата: 06.08.02 15:40
Оценка:
Здравствуйте Small, Вы писали:

S>Здравствуйте Mink, Вы писали:


M>>Используй PSAPI или ToolHelp функции. Но даже с ними напрямую, похоже, не получится, придется перебирать все процессы в системе и сравнивать имеющийся хэндл.


S>Такую гадость я никогда в жизни использовать не буду — для этого требуются отдельные dll-ки + это совершенно бесполезно. В конечном счете все они полуают информацию о запущенных процессах с помощью функции NtQueryDirectorySystemInformation с классом информации 5. Но она не возвращает информации о хендлах процессов, так как иони имеют значение только для конкретного процесса. NtQueryDirectorySystemInformation возвращает только общезначимую для системы информацию.


S>Значит и предлдагаемые тобой функции не возвращают нужной мне информации (ToolHelp — я проверил )


Раз такой монстр в Native-вещах — используй NtQueryInformationProcess, там что-то (не помню точно, может даже PROCESS_BASIC_INFORMATION) вернет тебе CLIENT_ID. Или или если не удастся, уж PEB-то всегда сможешь прочитать, а там ProcessId тоже есть.
Васкецов Сергей
http://registry.km.ru
Re[4]: ShellExecuteEx
От: Small  
Дата: 06.08.02 16:01
Оценка:
Здравствуйте Mink, Вы писали:


M>
M>DWORD aProcesses[1024], cbNeeded, cProcesses;
M>    unsigned int i;

M>    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
M>        return;

M>    // Calculate how many process identifiers were returned.

M>    cProcesses = cbNeeded / sizeof(DWORD);

M>    // Print the name and process identifier for each process.

M>    for( i = 0; i < cProcesses; i++ )
M>      {
M>         HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION |
M>                                   PROCESS_VM_READ,
M>                                   FALSE, aProcesses[i]));                
M>        if(ТвойХэндл ==  hProc)
M>          {
M>           //do something
M>          }
M>        else
M>          CloseHandle(hProc);
M>      }
M>


M>


К сожалению предложенный тобой способ не работает OpenProcess вернет другой хендл, отличный от полученного мною хендла процеса.
Re[4]: ShellExecuteEx
От: Small  
Дата: 06.08.02 16:02
Оценка:
Здравствуйте vasketsov, Вы писали:

С PEB пробовать не стал, а за NtQueryInformationProcess большое спаисбо действительно подходит PROCESS_BASIC_INFORMATION.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.