2009-09-16 3 views
3

Есть ли способ в коде для определения того, какой процесс или приложение запускает мой процесс или приложение. Любые .net, VB6 или C++ код надрезы бы здоровоОпределите, какой процесс/программа запустит мой процесс/программу

+0

Google термины я рекомендую (но не пробовал): окна поиска родительского процесса ... моя логика в том, что Linux поддерживает pid этого родителя процессов, поэтому, возможно, окна делают то же самое. –

ответ

1

В .Net,

Assembly.GetEntryAssembly() 

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

, чтобы получить версию сборки входа,

Assembly.GetEntryAssembly().GetName().Version 
0

Попробуйте это:

public class ParentProc { 

[DllImport("KERNEL32.dll")] //[DllImport("toolhelp.dll")] 
public static extern int CreateToolhelp32Snapshot(uint flags, uint processid); 

[DllImport("KERNEL32.DLL")] //[DllImport("toolhelp.dll")] 
public static extern int CloseHandle(int handle); 

[DllImport("KERNEL32.DLL")] //[DllImport("toolhelp.dll") 
public static extern int Process32Next(int handle, ref ProcessEntry32 pe); 

[StructLayout(LayoutKind.Sequential)] 
public struct ProcessEntry32 { 
public uint dwSize; 
public uint cntUsage; 
public uint th32ProcessID; 
public IntPtr th32DefaultHeapID; 
public uint th32ModuleID; 
public uint cntThreads; 
public uint th32ParentProcessID; 
public int pcPriClassBase; 
public uint dwFlags; 
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)] public string szExeFile; 
}; 

public static Process FindParentProcess() { 

int SnapShot = CreateToolhelp32Snapshot(0x00000002, 0); //2 = SNAPSHOT of all procs 
try{ 
ProcessEntry32 pe32 = new ProcessEntry32(); 
pe32.dwSize = 296; 
int procid = System.Diagnostics.Process.GetCurrentProcess().Id; 
while(Process32Next(SnapShot, ref pe32) != 0) { 
string xname = pe32.szExeFile.ToString(); 
if(procid==pe32.th32ProcessID) { 
return System.Diagnostics.Process.GetProcessById(Convert.ToInt32(pe32.th32ParentProcessID)); 
} 
} 

}catch(Exception ex){ 
throw new Exception(System.Reflection.MethodBase.GetCurrentMethod() + " failed! [Type:"+ex.GetType().ToString()+", Msg:"+ex.Message+"]"); 
}finally{ 
CloseHandle(SnapShot); 
} 
return null; 
} 

} 
1

Джеймс Браун показывает в своей «ProcessTree» фрагмент кода, как это сделать:

http://www.catch22.net/content/snippets

Хотя код очень C-иш это очень чистый и хорошо понимать.

Он в основном обращается к ZwQuerySystemInformation(), который возвращает структуру SYSTEM_PROCESSES во втором аргументе. Эта структура содержит информацию о процессе, в т.ч. член под названием InheritiedFromProcessId, который является идентификатором родительских процессов.

+0

Напомните, что ZwQuerySystemInformation не является частью SDK Windows, это функция NTDLL и может быть изменена или даже удалена из будущих версий Windows [1]. [1]: http://msdn.microsoft.com/en-us/library/ms725506(VS.85).aspx – Vargas

0

Если производительность здесь не является большой проблемой, вы также можете использовать WMI и, таким образом, оставаться на 100% управляемой (C#/VB.NET), если вам все равно.

Пример (только запросы WMI, фактический C#/VB.NET код опущен):

// First get figure the ID of your parent process 
    SELECT ParentProcessID FROM Win32_Process WHERE ProcessID = <MYPROCESSID> 

    // Than use that the get any attribute, e.g. the Name, of it 
    SELECT Name FROM Win32_Process WHERE ProcessID = <PARENTPROCESSID> 
Смежные вопросы