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

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

).
Функция CreateProcess тоже не подойдет.
Здравствуйте Small, Вы писали:
S>Уважаемые, ситуация заключается в следующем.
S>С помощью функции ShellExecuteEx запускаю некоторое приложение или открываю документ.
S>Как Вы знаете эта функция возвращает в передаваемой ей структуре SHELLEXECUTEINFO хендл процесса.
S>
Не подскажите ли как я могу получить идентификатор запущенного мною процесса? То есть проблема
S>более общая как по хендлу процесса получить его идентификатор в пользовательском режиме?
S>Прошу не предлагать варианты получения идентификатора по имени запускаемого процесса (приходится
S>открывать и документы, к тому же может быть запущено несколько приложений с тем же именем
).
S>Функция CreateProcess тоже не подойдет.
Используй PSAPI или ToolHelp функции. Но даже с ними напрямую, похоже, не получится, придется перебирать все процессы в системе и сравнивать имеющийся хэндл.
Здравствуйте Mink, Вы писали:
M>Используй PSAPI или ToolHelp функции. Но даже с ними напрямую, похоже, не получится, придется перебирать все процессы в системе и сравнивать имеющийся хэндл.
Такую гадость я никогда в жизни использовать не буду — для этого требуются отдельные dll-ки + это совершенно бесполезно. В конечном счете все они полуают информацию о запущенных процессах с помощью функции NtQueryDirectorySystemInformation с классом информации 5. Но она не возвращает информации о хендлах процессов, так как иони имеют значение только для конкретного процесса. NtQueryDirectorySystemInformation возвращает только общезначимую для системы информацию.
Значит и предлдагаемые тобой функции не возвращают нужной мне информации (ToolHelp — я проверил

)
Здравствуйте 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);
}
Здравствуйте Small, Вы писали:
S>Здравствуйте Mink, Вы писали:
M>>Используй PSAPI или ToolHelp функции. Но даже с ними напрямую, похоже, не получится, придется перебирать все процессы в системе и сравнивать имеющийся хэндл.
S>Такую гадость я никогда в жизни использовать не буду — для этого требуются отдельные dll-ки + это совершенно бесполезно. В конечном счете все они полуают информацию о запущенных процессах с помощью функции NtQueryDirectorySystemInformation с классом информации 5. Но она не возвращает информации о хендлах процессов, так как иони имеют значение только для конкретного процесса. NtQueryDirectorySystemInformation возвращает только общезначимую для системы информацию.
S>Значит и предлдагаемые тобой функции не возвращают нужной мне информации (ToolHelp — я проверил
)
Раз такой монстр в Native-вещах — используй NtQueryInformationProcess, там что-то (не помню точно, может даже PROCESS_BASIC_INFORMATION) вернет тебе CLIENT_ID. Или или если не удастся, уж PEB-то всегда сможешь прочитать, а там ProcessId тоже есть.
Здравствуйте 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 вернет другой хендл, отличный от полученного мною хендла процеса.