Получение id дочернего процесса, зная id родительского
От: Flammable Россия  
Дата: 15.08.10 12:35
Оценка:
Запускаю из своего приложения процесс A, который в свою очередь запускает другой процесс B. Сразу после запуска процесса B процесс A завершает работу. Как, зная id процесса A, узнать id процесса B?
родительский процесс дочерний процесс
Re: Получение id дочернего процесса, зная id родительского
От: Pavel Dvorkin Россия  
Дата: 15.08.10 15:37
Оценка:
Здравствуйте, Flammable, Вы писали:

F>Запускаю из своего приложения процесс A, который в свою очередь запускает другой процесс B. Сразу после запуска процесса B процесс A завершает работу. Как, зная id процесса A, узнать id процесса B?


До окончания A или после ?

Если после — задача некорректно поставлена. id после окончания не валиден

Если до окончания —

В Win32 есть Process32First/Process32Next. Они заполняют структуру PROCESSENTRY32, в которой есть

DWORD th32ParentProcessID;
The identifier of the process that created this process (its parent process).

Перебирая эти процессы, можно найти тот, у которого th32ParentProcessID == id A.

Почему-то это поле не присутствует в классе .NET Process.
With best regards
Pavel Dvorkin
Re[2]: Получение id дочернего процесса, зная id родительског
От: Flammable Россия  
Дата: 15.08.10 15:50
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

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


F>>Запускаю из своего приложения процесс A, который в свою очередь запускает другой процесс B. Сразу после запуска процесса B процесс A завершает работу. Как, зная id процесса A, узнать id процесса B?


PD>До окончания A или после ?


PD>Если после — задача некорректно поставлена. id после окончания не валиден


PD>Если до окончания —


PD>В Win32 есть Process32First/Process32Next. Они заполняют структуру PROCESSENTRY32, в которой есть


PD>DWORD th32ParentProcessID;

PD>The identifier of the process that created this process (its parent process).

PD>Перебирая эти процессы, можно найти тот, у которого th32ParentProcessID == id A.


PD>Почему-то это поле не присутствует в классе .NET Process.


Естественно, до окончания А.
Я пробовал способ с WinAPI, описанный здесь: http://blogs.msdn.com/b/toffer/archive/2005/07/21/441540.aspx , но функции CreateToolHelp32Snapshot в kernel32.dll у меня нет. Операционная система — Windows 7 x64.
Или можно обойтись без этой функции?
Re[3]: Получение id дочернего процесса, зная id родительског
От: Pavel Dvorkin Россия  
Дата: 16.08.10 03:55
Оценка:
Здравствуйте, Flammable, Вы писали:

F>Я пробовал способ с WinAPI, описанный здесь: http://blogs.msdn.com/b/toffer/archive/2005/07/21/441540.aspx , но функции CreateToolHelp32Snapshot в kernel32.dll у меня нет. Операционная система — Windows 7 x64.


Не может быть! Сейчас проверил — есть. У меня тоже W7-64

dumpbin.exe kernel32.dll /exports >log

190 BD 00001FD0 CreateToolhelp32Snapshot

Только будь внимателен — kernel32.dll надо взять из истинного system32, а не из того, что FAR показывает, потому что он показывает в действительности из SYSWOW64, т.е 32-битную. Впрочем, там она тоже есть.
With best regards
Pavel Dvorkin
Re[2]: Получение id дочернего процесса, зная id родительског
От: Flammable Россия  
Дата: 16.08.10 17:30
Оценка:
Подключаю kernel32.dll так:
[DllImport("kernel32.dll", EntryPoint = "CreateToolhelp32Shapshot", SetLastError = true, CharSet = CharSet.Auto)]
static extern IntPtr CreateToolhelp32Snapshot([In]UInt32 dwFlags, [In]UInt32 th32ProcessID);

В методе Main вызываю CreateToolhelp32Snapshot:
handleToShapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

И получаю исключение EntryPointNotFoundException.
Re: Получение id дочернего процесса, зная id родительского
От: _nn_ www.nemerleweb.com
Дата: 16.08.10 17:45
Оценка:
Здравствуйте, Flammable, Вы писали:

F>Запускаю из своего приложения процесс A, который в свою очередь запускает другой процесс B. Сразу после запуска процесса B процесс A завершает работу. Как, зная id процесса A, узнать id процесса B?


Можно через WMI с таким запросом:
SELECT * FROM Win32_Process WHERE ParentProcessId = <A PID>
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Получение id дочернего процесса, зная id родительског
От: Flammable Россия  
Дата: 16.08.10 18:36
Оценка:
Здравствуйте, _nn_, Вы писали:

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


F>>Запускаю из своего приложения процесс A, который в свою очередь запускает другой процесс B. Сразу после запуска процесса B процесс A завершает работу. Как, зная id процесса A, узнать id процесса B?


__>Можно через WMI с таким запросом:

__>
__>SELECT * FROM Win32_Process WHERE ParentProcessId = <A PID>
__>


Если не трудно, напишите пожалуйста, как делается такой запрос. С WMI вообще не знаком.
Re: Получение id дочернего процесса, зная id родительского
От: MozgC США http://nightcoder.livejournal.com
Дата: 16.08.10 20:19
Оценка:
Здравствуйте, Flammable, Вы писали:

F>Запускаю из своего приложения процесс A, который в свою очередь запускает другой процесс B. Сразу после запуска процесса B процесс A завершает работу. Как, зная id процесса A, узнать id процесса B?


Проще всего наверное так:

using System.Diagnostics;
using System.Management;

...

public static int GetParentProcessID(int processPID)
{
    var mo = new ManagementObject(string.Format("Win32_Process.Handle='{0}'", processPID));
    return Convert.ToInt32(mo["ParentProcessID"]);
}

...

int parentProcessID = GetParentProcessID(Process.GetCurrentProcess().Id);


Еще можно использовать класс PerformanceCounter, например так: How to get parent process in .NET in managed way.
Re[3]: Получение id дочернего процесса, зная id родительског
От: Twirl Швеция  
Дата: 16.08.10 20:47
Оценка:
Здравствуйте, Flammable, Вы писали:

F>Подключаю kernel32.dll так:

F> [DllImport("kernel32.dll", EntryPoint = "CreateToolhelp32Shapshot", SetLastError = true, CharSet = CharSet.Auto)]
F> static extern IntPtr CreateToolhelp32Snapshot([In]UInt32 dwFlags, [In]UInt32 th32ProcessID);

F>В методе Main вызываю CreateToolhelp32Snapshot:

F> handleToShapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

F>И получаю исключение EntryPointNotFoundException.


Проверь что компилируешь не под any cpu, а под x86.
Re[2]: Получение id дочернего процесса, зная id родительског
От: Jolly Roger  
Дата: 17.08.10 05:47
Оценка:
Здравствуйте, MozgC, Вы писали:

MC> var mo = new ManagementObject(string.Format("Win32_Process.Handle='{0}'", processPID));


Видимо, всё-таки "Win32_Process.ProcessId ='{0}'" ?
"Нормальные герои всегда идут в обход!"
Re[3]: Получение id дочернего процесса, зная id родительског
От: MozgC США http://nightcoder.livejournal.com
Дата: 17.08.10 09:03
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

MC>> var mo = new ManagementObject(string.Format("Win32_Process.Handle='{0}'", processPID));

JR>Видимо, всё-таки "Win32_Process.ProcessId ='{0}'" ?
Нет.
Re[3]: Получение id дочернего процесса, зная id родительског
От: Pavel Dvorkin Россия  
Дата: 17.08.10 10:03
Оценка: 4 (1)
Здравствуйте, Flammable, Вы писали:

F>Подключаю kernel32.dll так:

F> [DllImport("kernel32.dll", EntryPoint = "CreateToolhelp32Shapshot", SetLastError = true, CharSet = CharSet.Auto)]
F> static extern IntPtr CreateToolhelp32Snapshot([In]UInt32 dwFlags, [In]UInt32 th32ProcessID);

F>И получаю исключение EntryPointNotFoundException.


См. выделенное
With best regards
Pavel Dvorkin
Re[4]: Получение id дочернего процесса, зная id родительског
От: Flammable Россия  
Дата: 17.08.10 13:16
Оценка:
Здравствуйте, Twirl, Вы писали:

T>Проверь что компилируешь не под any cpu, а под x86.


Проверил, поменял Platform Target на x86. По-прежнему EntryPointNotFoundException.
Re[5]: Получение id дочернего процесса, зная id родительског
От: MozgC США http://nightcoder.livejournal.com
Дата: 17.08.10 13:20
Оценка:
Здравствуйте, Flammable, Вы писали:

F>Проверил, поменял Platform Target на x86. По-прежнему EntryPointNotFoundException.


То что я написал пробовали?
Re[4]: Получение id дочернего процесса, зная id родительског
От: Flammable Россия  
Дата: 17.08.10 13:21
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

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


F>>Подключаю kernel32.dll так:

F>> [DllImport("kernel32.dll", EntryPoint = "CreateToolhelp32Shapshot", SetLastError = true, CharSet = CharSet.Auto)]
F>> static extern IntPtr CreateToolhelp32Snapshot([In]UInt32 dwFlags, [In]UInt32 th32ProcessID);

F>>И получаю исключение EntryPointNotFoundException.


PD>См. выделенное


Черт, действительно там было h... А ведь перепроверял несколько раз! Всем спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.