Идентификатор процесса

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ASV
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 06.08.2002 (Вт) 7:16

Идентификатор процесса

Сообщение ASV » 23.11.2004 (Вт) 19:26

Подскажите, как получить идентификатор процесса (тот самый, который отображается в диспетчере задач WinXP), если его имя известно.

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 24.11.2004 (Ср) 0:16

Вырезка из API-Guide

Код: Выделить всё
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Const SW_SHOWNORMAL = 1
Const WM_CLOSE = &H10
Const gcClassnameMSWord = "OpusApp"
Const gcClassnameMSExcel = "XLMAIN"
Const gcClassnameMSIExplorer = "IEFrame"
Const gcClassnameMSVBasic = "wndclass_desked_gsk"
Const gcClassnameNotePad = "Notepad"
Const gcClassnameMyVBApp = "ThunderForm"
Private Sub Form_Load()
    'KPD-Team 1998
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim WinWnd As Long, Ret As String, RetVal As Long, lpClassName As String
    'Ask for a Window title
    Ret = InputBox("Enter the exact window title:" + Chr$(13) + Chr$(10) + "Note: must be an exact match")
    'Search the window
    WinWnd = FindWindow(vbNullString, Ret)
    If WinWnd = 0 Then MsgBox "Couldn't find the window ...": Exit Sub
    'Show the window
    ShowWindow WinWnd, SW_SHOWNORMAL
    'Create a buffer
    lpClassName = Space(256)
    'retrieve the class name
    RetVal = GetClassName(WinWnd, lpClassName, 256)
    'Show the classname
    MsgBox "Classname: " + Left$(lpClassName, RetVal)
    'Post a message to the window to close itself
    PostMessage WinWnd, WM_CLOSE, 0&, 0&
End Sub

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

ASV
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 06.08.2002 (Вт) 7:16

Сообщение ASV » 24.11.2004 (Ср) 5:46

WinWnd = FindWindow(vbNullString, Ret)
Известно только имя процесса, но оно, естественно, не совпвдает с Ret.
Ret - это заголовок окна, а его я тем более не знаю.

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 24.11.2004 (Ср) 8:40

Чуть переделал :
Код: Выделить всё
Option Explicit

Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Const MAX_PATH As Integer = 260
Private Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long
    th32DefaultHeapID As Long
    th32ModuleID As Long
    cntThreads As Long
    th32ParentProcessID As Long
    pcPriClassBase As Long
    dwFlags As Long
    szExeFile As String * MAX_PATH
End Type
Private Declare Function CreateToolhelp32Snapshot Lib "Kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "Kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "Kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Sub CloseHandle Lib "Kernel32" (ByVal hPass As Long)
Private Function GetNamebyPid(PID As Long) As String
Dim r As Long
    'KPD-Team 2000
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim hSnapShot As Long, uProcess As PROCESSENTRY32
    'Takes a snapshot of the processes and the heaps, modules, and threads used by the processes
    hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
    'set the length of our ProcessEntry-type
    uProcess.dwSize = Len(uProcess)
    'Retrieve information about the first process encountered in our system snapshot
    r = Process32First(hSnapShot, uProcess)
    'set graphics mode to persistent
   
    Do While r
    If uProcess.th32ProcessID = PID Then
         GetNamebyPid = Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0))
        Exit Do
End If


        'Retrieve information about the next process recorded in our system snapshot
        r = Process32Next(hSnapShot, uProcess)
    Loop
    'close our snapshot handle
    CloseHandle hSnapShot
End Function
الفيجوال بيسك الرابح

ASV
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 06.08.2002 (Вт) 7:16

Сообщение ASV » 24.11.2004 (Ср) 11:43

Классно! Но имя-то мне известно.
Более детально:
Процесс отображается в диспетчере задач как alien1.exe.
Нужно найти его PID.
--------------------------
Вообще-то задача стоит такая:
Из своей оболочки main.exe я запускаю alien.exe.
Эксперементальным путём установил, что alien.exe в свою очередь запускает alien1.exe, alien2.exe, и т.д.
При выходе из main.exe хочу закрыть alien.exe, а также всё то, что он запустил: alien1.exe, alien2.exe, и т.д

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 24.11.2004 (Ср) 19:23

Вопрос в тему: написал на С++ ДЛЛ, как раз для подобных вещей.
Пашет нормально, НО:
в ВБ не подключается, говорит - нет такой функции.....
Посмотрел список экспорта - там действительно другое имя, черт знает какое! Если кто знает в чем дело - скажите, плз.
Длл-ку могу приложить.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.11.2004 (Ср) 21:15

Нужно def-файл к проекту подключать, и в нём объявлять экспортируемые функции. Иначе у меня не получалось.
Ну, и ещё они stdcall должны быть, конечно же.
Изображение

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 25.11.2004 (Чт) 16:56

Странно, мне казалось, что когда-то я даже использовал ДЛЛки написанныее НЕ на ВБ, безо всяких .def........
А что должно быть в этом .def? Можешь пример привести?

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 25.11.2004 (Чт) 17:03

А ДЛЛка вот:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.11.2004 (Чт) 17:09

def нужен при компиляции библы в C++. Там должно быть написано

LIBRARY LibName

EXPORTS
FuncName1 @1
FuncName2 @2
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 25.11.2004 (Чт) 17:15

Ну надо же.... В самом деле: век живи-век учись.......
В статьях по созданию ДЛЛ на С++ было сказано только про .h файл.
Я и создавал дллки без .def и они отлично работали........

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.11.2004 (Чт) 17:17

Ariman писал(а):Пашет нормально, НО:
в ВБ не подключается, говорит - нет такой функции.....
Посмотрел список экспорта - там действительно другое имя, черт знает какое! Если кто знает в чем дело - скажите, плз.
Длл-ку могу приложить.
Lasciate ogni speranza, voi ch'entrate.

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 25.11.2004 (Чт) 17:18

Да, забыл спросить: в .def должны быть только имена функций, или как в прототипе - параметры, возвращаемое значение...?

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 25.11.2004 (Чт) 17:20

Хм.. Попробовал - а компиллятор мне вот что выдал:
[Linker Warning] Attempt to export non-public symbol 'ReturnProcess'
[Linker Warning] Attempt to export non-public symbol 'TerminateProcessByPID'

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 25.11.2004 (Чт) 17:32

В общем, у меня в .срр объявление такое:
bool _stdcall TerminateProcessByPID(DWORD PID)

в .h такое:
bool _stdcall __export TerminateProcessByPID(DWORD PID);

в .def такое:
TerminateProcessByPID @2

В результате компиллятор выдает описанные выше warning'и, а просмотр экспортируемых функций -
@TerminateProcessByPID$qqsul

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 25.11.2004 (Чт) 17:41

Ariman писал(а):Хм.. Попробовал - а компиллятор мне вот что выдал:
[Linker Warning] Attempt to export non-public symbol 'ReturnProcess'
[Linker Warning] Attempt to export non-public symbol 'TerminateProcessByPID'


для VC
см. http://www.mentalis.org/vbtutor/vcdll1.shtml особенно пример

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 25.11.2004 (Чт) 18:06

Я не на VC пишу...
Просмотрел свою ДЛЛку утилитой TDump, увидел, что все функции нормально перечислены.
Так что дело не в ДЛЛ.
Но ВБ почему-то их не видит! Попробовал по номеру вызывать - работает...... Странно......

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.11.2004 (Чт) 18:38

Ariman, твой сибилдер-или-кто-там просто подставляет вместо "нормального" имени функции "декорированое", включающее зашифрованные объявления параметров.
Как избавиться от этого декорирования - не знаю, с сибилдерами никогда не работал. Проверено, что в VC def-файла достаточно.
Изображение

Ariman
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 817
Зарегистрирован: 02.09.2003 (Вт) 16:23
Откуда: Великая наша держава, г.Москва

Сообщение Ariman » 25.11.2004 (Чт) 18:56

Ну ладно.

"Будем искать!" (с) С.С. Горбунков


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 18

    TopList