선언:

C#

[DllImport("kernel32")]
public static extern Int32 TerminateProcess(IntPtr hProcess, Int32 ExitCode);


VB.NET

<DllImport("kernel32")> _
Public Shared Function TerminateProcess(ByVal hProcess As IntPtr, ByVal ExitCode As Int32) As Int32
End Function




사용 예제:

C#

using System;
using System.Runtime.InteropServices;

namespace ApiReference {
    class ApiExample {
        [DllImport("kernel32")]
        public static extern Int32 TerminateProcess(IntPtr hProcess, Int32 ExitCode);
        [DllImport("kernel32")]
        public static extern void CloseHandle(IntPtr hProcess);
        [DllImport("kernel32")]
        public static extern IntPtr OpenProcess(Int32 Access, Boolean InheritHandle, Int32 ProcessId);
        public const Int32 PROCESS_TERMINATE = 0x1;

        public static void Main(string[] args) {
        EnterPID:
            Int32 ProcessId;
            Console.Write("종료할 프로세스의 식별자(PID)를 입력하세요: ");
            try {
                ProcessId = Int32.Parse(Console.ReadLine());
            } catch (Exception) {
                Console.WriteLine("다시 입력하세요");
                goto EnterPID;
            }
            
            IntPtr hProcess = OpenProcess(PROCESS_TERMINATE, false, ProcessId);
            Boolean result = false;
            if ( hProcess == IntPtr.Zero ) {
                Console.WriteLine("프로세스 핸들 열기 실패!");
                return;
            }

            if ( TerminateProcess(hProcess, 0) != 0 ) {
                Console.WriteLine("프로세스 종료 성공!");
                result = true;
            } else {
                Console.WriteLine("프로세스 종료 실패!");
            }

            CloseHandle(hProcess);
            Console.ReadKey(true);
        }
    }
}


VB.NET

Imports System
Imports System.Runtime.InteropServices

Namespace ApiReference
    Class ApiExample
        <DllImport("kernel32")> _
        Public Shared Function TerminateProcess(hProcess As IntPtr, ExitCode As Int32) As Int32
        End Function
        <DllImport("kernel32")> _
        Public Shared Sub CloseHandle(hProcess As IntPtr)
        End Sub
        <DllImport("kernel32")> _
        Public Shared Function OpenProcess(Access As Int32, InheritHandle As [Boolean], ProcessId As Int32) As IntPtr
        End Function
        Public Const PROCESS_TERMINATE As Int32 = &H1

        Public Shared Sub Main(args As String())
            EnterPID:
            Dim ProcessId As Int32
            Console.Write("종료할 프로세스의 식별자(PID)를 입력하세요: ")
            Try
                ProcessId = Int32.Parse(Console.ReadLine())
            Catch generatedExceptionName As Exception
                Console.WriteLine("다시 입력하세요")
                GoTo EnterPID
            End Try

            Dim hProcess As IntPtr = OpenProcess(PROCESS_TERMINATE, False, ProcessId)
            Dim result As [Boolean] = False
            If hProcess = IntPtr.Zero Then
                Console.WriteLine("프로세스 핸들 열기 실패!")
                Return
            End If

            If TerminateProcess(hProcess, 0) <> 0 Then
                Console.WriteLine("프로세스 종료 성공!")
                result = True
            Else
                Console.WriteLine("프로세스 종료 실패!")
            End If

            CloseHandle(hProcess)
            Console.ReadKey(True)
        End Sub
    End Class
End Namespace




예제 실행 결과:




매개 변수 설명:

hProcess - PROCESS_TERMINATE 권한으로 열린 프로세스의 핸들을 입력합니다.

ExitCode - 프로세스의 종료 코드를 입력합니다.




API 설명:

프로세스를 종료합니다.




참고:

TerminateProcess (MSDN)

Process Security And Access Rights (MSDN)




비고:

OpenProcess API를 사용하여 프로세스 핸들을 얻은 후에 TerminateProcess API를 호출함으로써,

프로세스를 강제로 종료할 수 있습니다. 단, 프로세스가 보호되었거나 PROCESS_TERMINATE 권한이 없을 경우엔

프로세스가 종료되지 않습니다.

'API Reference' 카테고리의 다른 글

7. CloseHandle  (0) 2014.09.11
6. IsWow64Process  (0) 2014.09.10
4. OpenProcess  (0) 2013.12.12
3. NtQueryInformationProcess  (0) 2013.12.06
2. RemoveDirectory  (0) 2013.12.04

+ Recent posts