본문 바로가기
프로그래머/프로그래밍

VB 프로세스 끝내기

by plog 2009. 11. 26.
이미지 이름 또는 프로세스  아이디를 이용해 특정 프로세스를 강제로종료하는 소스입니다.
아래의 소스를 모듈에 넣으시면 됩니다.
2가지 기능을 제공합니다.

1. 이미지 이름을 이용해 특정 프로세스를 강제 종료
   예) KillPID GetPidByImage("IEXPLORE.EXE")

2. PID 를 이용해 강제 종료
   예) KillPID 568

참고: GetPidByImage 함수의 원 작성자는 제가 아니며 수정 하여 사용 하였습니다.

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 Const TH32CS_SNAPPROCESS As Long = &H2
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 * 260
End Type
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Const PROCESS_TERMINATE As Long = (&H1)
Private Declare Function TerminateProcess Lib "kernel32.dll" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

Public Function GetPidByImage(ByVal image As String) As Long
   On Local Error GoTo ErrOut:
   Dim hSnapShot As Long
   Dim uProcess As PROCESSENTRY32
   Dim r As Long, l As Long
  
   hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&)
   If hSnapShot = 0 Then Exit Function
  uProcess.dwSize = Len(uProcess)
   r = Process32First(hSnapShot, uProcess)
   l = Len(image)
   If l = 0 Then Exit Function
   Do While r
     If LCase(Left(uProcess.szExeFile, l)) = LCase(image) Then
       GetPidByImage = uProcess.th32ProcessID
       Exit Do
     End If
     r = Process32Next(hSnapShot, uProcess)
   Loop
   Call CloseHandle(hSnapShot)
ErrOut:
End Function

Public Sub KillPID(ByVal pid As Long)
   On Local Error Resume Next
   Dim h As Long
   If pid = 0 Then Exit Sub
   h = OpenProcess(PROCESS_TERMINATE, False, pid)
   TerminateProcess h, 0
   CloseHandle h
   Sleep 1000
ErrOut:
End Sub 

댓글