Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Создание справочника Windows API

Страница: 1 |

 

  Вопрос: Как узнать родительский процесс моего процесса? Добавлено: 13.06.10 11:54  

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

Ответить

  Ответы Всего ответов: 1  

Номер ответа: 1
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #1
Добавлено: 13.06.10 20:00
http://msdn.microsoft.com/en-us/library/ms684280(VS.85).aspx

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам