Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать родительский процесс моего процесса? С помощью Win API 
:(
    Опции темы
ainis
Дата 13.6.2010, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 15.2.2009

Репутация: нет
Всего: нет



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


PM MAIL   Вверх
diadiavova
Дата 13.6.2010, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Код

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)



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0726 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.