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