Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как убить процесс на VB ? / 6 сообщений из 6, страница 1 из 1
22.09.2004, 16:09:16
    #32706928
Vw
Vw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убить процесс на VB ?
Или закрыть открытый файл зная его PID ?
...
Рейтинг: 0 / 0
22.09.2004, 16:13:03
    #32706948
MegaDimon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убить процесс на VB ?
Используя WinAPI/ тем более PID знаешь
...
Рейтинг: 0 / 0
22.09.2004, 16:16:46
    #32706961
Vw
Vw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убить процесс на VB ?
Дык а как ?
...
Рейтинг: 0 / 0
22.09.2004, 16:21:11
    #32706976
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убить процесс на VB ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
Const MAX_PATH& =  260 

Declare Function TerminateProcess _
    Lib "kernel32" (ByVal ApphProcess As Long, _
    ByVal uExitCode As Long) As Long
Declare Function OpenProcess Lib _
    "kernel32" (ByVal dwDesiredAccess As Long, _
    ByVal blnheritHandle As Long, _
    ByVal dwAppProcessId As Long) As Long
Declare Function ProcessFirst _
    Lib "kernel32" Alias "Process32First" _
    (ByVal hSnapshot As Long, _
    uProcess As PROCESSENTRY32) As Long
Declare Function ProcessNext _
    Lib "kernel32" Alias "Process32Next" _
    (ByVal hSnapshot As Long, _
    uProcess As PROCESSENTRY32) As Long
Declare Function CreateToolhelpSnapshot _
    Lib "kernel32" Alias "CreateToolhelp32Snapshot" _
    (ByVal lFlags As Long, _
    lProcessID As Long) As Long
Declare Function CloseHandle _
    Lib "kernel32" (ByVal hObject As Long) As Long

Private Type LUID
   lowpart As Long
   highpart As Long
End Type

Private Type TOKEN_PRIVILEGES
    PrivilegeCount As Long
    LuidUDT As LUID
    Attributes As Long
End Type

Const TOKEN_ADJUST_PRIVILEGES = &H20
Const TOKEN_QUERY = &H8
Const SE_PRIVILEGE_ENABLED = &H2
Const PROCESS_ALL_ACCESS = &H1F0FFF

Private Declare Function GetVersion _
    Lib "kernel32" () As Long
Private Declare Function GetCurrentProcess _
    Lib "kernel32" () As Long
Private Declare Function OpenProcessToken _
    Lib "advapi32" (ByVal ProcessHandle As Long, _
    ByVal DesiredAccess As Long, _
    TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue _
    Lib "advapi32" Alias "LookupPrivilegeValueA" _
    (ByVal lpSystemName As String, _
    ByVal lpName As String, _
    lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges _
    Lib "advapi32" (ByVal TokenHandle As Long, _
    ByVal DisableAllPrivileges As Long, _
    NewState As TOKEN_PRIVILEGES, _
    ByVal BufferLength As Long, _
    PreviousState As Any, _
    ReturnLength As Any) As Long

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
 '--------------------------------------- 


 'Terminate any application and return an exit code to Windows. 
Function KillProcess(ByVal hProcessID As Long, Optional ByVal exitCode As Long) As Boolean
    Dim hToken As Long
    Dim hProcess As Long
    Dim tp As TOKEN_PRIVILEGES
    

    If GetVersion() >=  0  Then

        If OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hToken) =  0  Then
            GoTo CleanUp
        End If

        If LookupPrivilegeValue("", "SeDebugPrivilege", tp.LuidUDT) =  0  Then
            GoTo CleanUp
        End If

        tp.PrivilegeCount =  1 
        tp.Attributes = SE_PRIVILEGE_ENABLED

        If AdjustTokenPrivileges(hToken, False, tp,  0 , ByVal  0 &, ByVal  0 &) =  0  Then
            GoTo CleanUp
        End If
    End If

    hProcess = OpenProcess(PROCESS_ALL_ACCESS,  0 , hProcessID)
    If hProcess Then

        KillProcess = (TerminateProcess(hProcess, exitCode) <>  0 )
         ' close the process handle 
        CloseHandle hProcess
    End If
    
    If GetVersion() >=  0  Then
         ' under NT restore original privileges 
        tp.Attributes =  0 
        AdjustTokenPrivileges hToken, False, tp,  0 , ByVal  0 &, ByVal  0 &
        
CleanUp:
        If hToken Then CloseHandle hToken
    End If
    
End Function



KillProcess(uProcess.th32ProcessID,  0 ) 
Magnus
...
Рейтинг: 0 / 0
22.09.2004, 16:28:13
    #32706996
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убить процесс на VB ?
Вообще-то убийство процессов свидетельствует о низкой квалификации разработчика. Это средство действенно когда ты уже "сделал все что мог" а процесс упорно работает. Лучше всего заложить возможность останова в самом процессе. Это самый правильный подход.
Из утилит можно назвать pskill.exe из www.sysinternals.com (для Windows NT,2000) или taskkill.exe (она встроена в Windows 2003, и возм. в XP).
И конечно-же есть API функция которая это выполняет. (документацию почитаешь сам).
...
Рейтинг: 0 / 0
22.09.2004, 16:29:40
    #32707001
MegaDimon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как убить процесс на VB ?
Если на .NET то так можно:
Код: plaintext
1.
2.
   Process p = Process.Start("MyProcApp.exe");
   // Работа процесса .....
   p.Kill();

Если нужен WinApi, то:
Код: plaintext
1.
2.
3.
BOOL TerminateProcess(
    IN HANDLE hProcess,    // описатель процесса
    IN DWORD dwExitCode    // код завершения процесса
    );

Прмер функии завершающей процесс по PID:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
BOOL KillProcess(
    IN DWORD dwProcessId
    )
{
    // получаем описатель процесса
    HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessId);
    if (hProcess == NULL)
        return FALSE;

    DWORD dwError = ERROR_SUCCESS;

    // пытаемся завершить процесс
    if (!TerminateProcess(hProcess, (DWORD)- 1 ))
        dwError = GetLastError();

    // закрываем описатель процесса
    CloseHandle(hProcess);

    SetLastError(dwError);
    return dwError == ERROR_SUCCESS;
}

Дальше осталось сделать включение этой ф-ии в VB и все!
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как убить процесс на VB ? / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]