Язык - 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 родительского процесса?
Ответить
|