Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Как узнать родительский процесс моего процесса?


Автор: ainis 13.6.2010, 12:09
Язык - VB.Net 2005. 
Требуется узнать, какая программа запускает мою программу. 
Пробую использовать такой код (на форме Form1 размещена кнопка Button1 и ListBox1, куда пытаюсь записать ID выполняющихся процессов):

Код

Imports System 
Imports System.Runtime.InteropServices 
Public Class Form1 
Private Declare Function CreateToolhelpSnapshot Lib "Kernel32" Alias _ 
"CreateToolhelp32Snapshot" (ByVal lFlags As Long, _ 
ByVal lProcessID As Long) As Long   
Private Declare Function ProcessFirst Lib "Kernel32" Alias _ 
"Process32First" (ByRef hSnapShot As Long, ByRef uProcess As PROCESSENTRY32) As Long 
Private Declare Function ProcessNext Lib "Kernel32" Alias _ 
"Process32Next" (ByRef hSnapshot As Long, ByRef uProcess As PROCESSENTRY32) As Long 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
Dim IDProc As Integer = Process.GetCurrentProcess.Id 'ID моего процесса 
Const TH32CS_SNAPPROCESS As Long = 2& 
Dim hSnapShot As Long = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0)   
Dim uProcess As New PROCESSENTRY32 
uProcess.dwSize = Marshal.SizeOf(uProcess) 
ListBox1.Items.Clear() 
Dim ProcFound As Boolean = ProcessFirst(hSnapShot, uProcess) 
Do While ProcFound 'перебираем процессы 
ListBox1.Items.Add(CStr(uProcess.th32ProcessID)) 
If uProcess.th32ProcessID = IDProc Then 'нашли мой процесс 
Exit Do 
Else 'продолжаем перебирать процессы 
ProcFound = ProcessNext(hSnapShot, uProcess) 
End If 
If ListBox1.Items.Count > 30 Then Exit Do'пришлось добавить, чтобы бесконечно не выполнялось 
Loop 
End Sub 
  
Private Structure PROCESSENTRY32   
Dim dwSize As Long 
Dim cntUsage As Long 
Dim th32ProcessID As Long 
Dim th32DefaultHeapID As Long 
Dim th32ModuleID As Long 
Dim cntThreads As Long 
Dim th32ParentProcessID As Long 
Dim pcPriClassBase As Long 
Dim dwflags As Long 
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> Public szExeFile As String 
End Structure 

End Class


К сожалению, ничего не получается: не находит мой процесс, выдает полную чушь в ListBox1 (все числа, кроме первого и второго, повторяются; после повторных нажатий кнопки меняется только первое число, остальные остаются неизменными), к тому же, если искусственно не остановить, программа зациклится: цикл Do While Loop выполняется бесконечно. 

Если пробовать передавать параметры в ProcessFirst и ProcessNext не по ссылке (ByRef), а по значению (ByVal), появляется сообщение об ошибке: "Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.". 
Как все-таки получить ID родительского процесса?


Автор: diadiavova 13.6.2010, 14:13
Код

Dim pc As New PerformanceCounter("Process", "Creating Process Id", _
       Process.GetCurrentProcess.ProcessName)
Dim p As Process = Process.GetProcessById(CInt(pc.RawValue))
MsgBox(p.MainModule.ModuleName)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)