연습: Windows Api 호출 (Visual Basic)Walkthrough: Calling Windows APIs (Visual Basic)

Windows Api는 Windows 운영 체제의 일부인 Dll (동적 연결 라이브러리)입니다.Windows APIs are dynamic-link libraries (DLLs) that are part of the Windows operating system. 이러한 작업을 사용 하 여 고유한 프로시저를 작성 하기가 어려울 때 작업을 수행할 수 있습니다.You use them to perform tasks when it is difficult to write equivalent procedures of your own. 예를 들어 Windows는 응용 프로그램에 FlashWindowEx 대 한 제목 표시줄을 밝은 색과 어두운 음영 사이에서 교대로 수행할 수 있는 라는 함수를 제공 합니다.For example, Windows provides a function named FlashWindowEx that lets you make the title bar for an application alternate between light and dark shades.

코드에서 Windows Api를 사용 하는 이점은 이미 작성 되어 사용 대기 중인 수십 개의 유용한 함수를 포함 하기 때문에 개발 시간을 절약할 수 있다는 점입니다.The advantage of using Windows APIs in your code is that they can save development time because they contain dozens of useful functions that are already written and waiting to be used. 단점은 Windows Api를 사용 하는 것이 어려울 수 있습니다.The disadvantage is that Windows APIs can be difficult to work with and unforgiving when things go wrong.

Windows Api는 특별 한 종류의 상호 운용성을 나타냅니다.Windows APIs represent a special category of interoperability. Windows Api는 관리 코드를 사용 하지 않고, 기본 제공 형식 라이브러리를 사용 하지 않으며, Visual Studio에서 사용 되는 것과 다른 데이터 형식을 사용 합니다.Windows APIs do not use managed code, do not have built-in type libraries, and use data types that are different than those used with Visual Studio. 이러한 차이로 인해 Windows Api는 COM 개체가 아니기 때문에 Windows Api와의 상호 운용성 및 .NET Framework는 플랫폼 호출 또는 PInvoke를 사용 하 여 수행 됩니다.Because of these differences, and because Windows APIs are not COM objects, interoperability with Windows APIs and the .NET Framework is performed using platform invoke, or PInvoke. 플랫폼 호출은 관리 코드에서 Dll에 구현 된 관리 되지 않는 함수를 호출할 수 있도록 하는 서비스입니다.Platform invoke is a service that enables managed code to call unmanaged functions implemented in DLLs. 자세한 내용은 관리 되지 않는 DLL 함수사용을 참조 하세요.For more information, see Consuming Unmanaged DLL Functions. Declare 문을 사용 하거나 빈 프로시저에 DllImport 특성을 적용 하 여 Visual Basic에서 PInvoke를 사용할 수 있습니다.You can use PInvoke in Visual Basic by using either the Declare statement or applying the DllImport attribute to an empty procedure.

Windows API 호출은 과거에 Visual Basic 프로그래밍의 중요 한 부분 이지만 Visual Basic .NET에서는 거의 필요 하지 않습니다.Windows API calls were an important part of Visual Basic programming in the past, but are seldom necessary with Visual Basic .NET. 가능 하면 Windows API 호출 대신 .NET Framework에서 관리 코드를 사용 하 여 작업을 수행 해야 합니다.Whenever possible, you should use managed code from the .NET Framework to perform tasks, instead of Windows API calls. 이 연습에서는 Windows Api를 사용 해야 하는 상황에 대 한 정보를 제공 합니다.This walkthrough provides information for those situations in which using Windows APIs is necessary.

참고

일부 Visual Studio 사용자 인터페이스 요소의 경우 다음 지침에 설명된 것과 다른 이름 또는 위치가 시스템에 표시될 수 있습니다.Your computer might show different names or locations for some of the Visual Studio user interface elements in the following instructions. 이러한 요소는 사용하는 Visual Studio 버전 및 설정에 따라 결정됩니다.The Visual Studio edition that you have and the settings that you use determine these elements. 자세한 내용은 IDE 개인 설정을 참조하세요.For more information, see Personalizing the IDE.

선언을 사용 하 여 API 호출API Calls Using Declare

Windows api를 호출 하는 가장 일반적인 방법은 Declare 문을 사용 하는 것입니다.The most common way to call Windows APIs is by using the Declare statement.

DLL 프로시저를 선언 하려면To declare a DLL procedure

  1. 호출 하려는 함수의 이름과 인수, 인수 형식 및 반환 값을 확인 하 고이를 포함 하는 DLL의 이름과 위치를 확인 합니다.Determine the name of the function you want to call, plus its arguments, argument types, and return value, as well as the name and location of the DLL that contains it.

    참고

    Windows Api에 대 한 전체 정보는 Platform SDK Windows API에서 Win32 SDK 설명서를 참조 하세요.For complete information about the Windows APIs, see the Win32 SDK documentation in the Platform SDK Windows API. Windows Api에서 사용 하는 상수에 대 한 자세한 내용은 Platform SDK에 포함 된 Windows 등의 헤더 파일을 검사 합니다.For more information about the constants that Windows APIs use, examine the header files such as Windows.h included with the Platform SDK.

  2. 파일 메뉴에서 새로 만들기 를 클릭 한 다음 프로젝트를 클릭 하 여 새 Windows 응용 프로그램 프로젝트를 엽니다.Open a new Windows Application project by clicking New on the File menu, and then clicking Project. 새 프로젝트 대화 상자가 나타납니다.The New Project dialog box appears.

  3. Visual Basic 프로젝트 템플릿 목록에서 Windows 응용 프로그램 을 선택 합니다.Select Windows Application from the list of Visual Basic project templates. 새 프로젝트가 표시 됩니다.The new project is displayed.

  4. DLL을 사용 Declare 하려는 클래스나 모듈에 다음 함수를 추가 합니다.Add the following Declare function either to the class or module in which you want to use the DLL:

    Declare Auto Function MBox Lib "user32.dll" Alias "MessageBox" (
        ByVal hWnd As Integer,
        ByVal txt As String,
        ByVal caption As String,
        ByVal Typ As Integer) As Integer
    

Declare 문의 일부Parts of the Declare Statement

Declare 문에는 다음과 같은 요소가 포함 됩니다.The Declare statement includes the following elements.

Auto 한정자Auto modifier

한정자 Auto 는 공용 언어 런타임 규칙 또는 별칭 이름 (지정 된 경우)에 따라 메서드 이름에 따라 문자열을 변환 하도록 런타임에 지시 합니다.The Auto modifier instructs the runtime to convert the string based on the method name according to common language runtime rules (or alias name if specified).

Lib 및 Alias 키워드Lib and Alias keywords

Function 키워드 뒤의 이름은 프로그램에서 가져온 함수에 액세스 하는 데 사용 하는 이름입니다.The name following the Function keyword is the name your program uses to access the imported function. 호출 하는 함수의 실제 이름과 같을 수도 있고, 유효한 프로시저 이름을 사용 하 고 Alias 키워드를 사용 하 여 호출 하는 함수의 실제 이름을 지정할 수도 있습니다.It can be the same as the real name of the function you are calling, or you can use any valid procedure name and then employ the Alias keyword to specify the real name of the function you are calling.

Lib 키워드를 지정 하 고 그 뒤에 호출 하는 함수가 포함 된 DLL의 이름과 위치를 지정 합니다.Specify the Lib keyword, followed by the name and location of the DLL that contains the function you are calling. Windows 시스템 디렉터리에 있는 파일에 대 한 경로를 지정할 필요가 없습니다.You do not need to specify the path for files located in the Windows system directories.

호출 하 Alias 는 함수 이름이 올바른 Visual Basic 프로시저 이름이 아니거나 응용 프로그램의 다른 항목 이름과 충돌 하는 경우 키워드를 사용 합니다.Use the Alias keyword if the name of the function you are calling is not a valid Visual Basic procedure name, or conflicts with the name of other items in your application. Alias호출 되는 함수의 실제 이름을 나타냅니다.Alias indicates the true name of the function being called.

인수 및 데이터 형식 선언Argument and Data Type Declarations

인수와 해당 데이터 형식을 선언 합니다.Declare the arguments and their data types. 이 부분은 Windows에서 사용 하는 데이터 형식이 Visual Studio 데이터 형식과 일치 하지 않기 때문에 어려울 수 있습니다.This part can be challenging because the data types that Windows uses do not correspond to Visual Studio data types. Visual Basic는 인수를 호환 되는 데이터 형식으로 변환 하 여 마샬링이라는 프로세스를 수행 하는 데 많은 작업을 수행 합니다.Visual Basic does a lot of the work for you by converting arguments to compatible data types, a process called marshaling. 네임System.Runtime.InteropServices 스페이스에 정의 된 특성을 MarshalAsAttribute 사용 하 여 인수가 마샬링되는 방식을 명시적으로 제어할 수 있습니다.You can explicitly control how arguments are marshaled by using the MarshalAsAttribute attribute defined in the System.Runtime.InteropServices namespace.

참고

이전 버전의 Visual Basic을 사용 하 여 매개 As Any변수를 선언할 수 있습니다. 즉, 모든 데이터 형식의 데이터를 사용할 수 있습니다.Previous versions of Visual Basic allowed you to declare parameters As Any, meaning that data of any data type could be used. Visual Basic를 사용 하려면 모든 Declare 문에 특정 데이터 형식을 사용 해야 합니다.Visual Basic requires that you use a specific data type for all Declare statements.

Windows API 상수Windows API Constants

일부 인수는 상수의 조합입니다.Some arguments are combinations of constants. 예를 들어이 MessageBox 연습에 표시 된 API는 메시지 상자가 표시 되 Typ 는 방식을 제어 하는 라는 정수 인수를 허용 합니다.For example, the MessageBox API shown in this walkthrough accepts an integer argument called Typ that controls how the message box is displayed. 이 상수는 winuser.h 파일의 #define 문을 검사 하 여 숫자 값을 확인할 수 있습니다.You can determine the numeric value of these constants by examining the #define statements in the file WinUser.h. 숫자 값은 일반적으로 16 진수로 표시 되므로 계산기를 사용 하 여 숫자 값을 추가 하 고 decimal로 변환 하는 것이 좋습니다.The numeric values are generally shown in hexadecimal, so you may want to use a calculator to add them and convert to decimal. 예를 들어 느낌표 MB_ICONEXCLAMATION 및 예/아니요 스타일 MB_YESNO 0x00000004에 대 한 상수를 결합 하려는 경우 숫자를 추가 하 고 0x00000030 또는 52 진수의 결과를 가져올 수 있습니다.For example, if you want to combine the constants for the exclamation style MB_ICONEXCLAMATION 0x00000030 and the Yes/No style MB_YESNO 0x00000004, you can add the numbers and get a result of 0x00000034, or 52 decimal. Decimal 결과를 직접 사용할 수 있지만 이러한 값을 응용 프로그램에서 상수로 선언 하 고 Or 연산자를 사용 하 여 결합 하는 것이 좋습니다.Although you can use the decimal result directly, it is better to declare these values as constants in your application and combine them using the Or operator.

Windows API 호출에 대 한 상수를 선언 하려면To declare constants for Windows API calls
  1. 호출 하는 Windows 함수에 대 한 설명서를 참조 하세요.Consult the documentation for the Windows function you are calling. 이 상수에 사용 되는 상수의 이름과 이러한 상수에 대 한 숫자 값을 포함 하는 .h 파일의 이름을 결정 합니다.Determine the name of the constants it uses and the name of the .h file that contains the numeric values for these constants.

  2. 메모장과 같은 텍스트 편집기를 사용 하 여 헤더 (.h) 파일의 내용을 보고 사용 중인 상수와 연결 된 값을 찾습니다.Use a text editor, such as Notepad, to view the contents of the header (.h) file, and find the values associated with the constants you are using. 예를 들어 API MessageBox 는 상수 MB_ICONQUESTION 를 사용 하 여 메시지 상자에 물음표를 표시 합니다.For example, the MessageBox API uses the constant MB_ICONQUESTION to show a question mark in the message box. 에 대 한 MB_ICONQUESTION 정의는 winuser.h에 있으며 다음과 같이 표시 됩니다.The definition for MB_ICONQUESTION is in WinUser.h and appears as follows:

    #define MB_ICONQUESTION 0x00000020L

  3. 이러한 상수 Const 를 응용 프로그램에서 사용할 수 있도록 클래스 또는 모듈에 해당 하는 문을 추가 합니다.Add equivalent Const statements to your class or module to make these constants available to your application. 예를 들어:For example:

    Const MB_ICONQUESTION As Integer = &H20
    Const MB_YESNO As Integer = &H4
    Const IDYES As Integer = 6
    Const IDNO As Integer = 7
    
DLL 프로시저를 호출 하려면To call the DLL procedure
  1. 이라는 Button1 단추를 프로젝트의 시작 폼에 추가한 다음 두 번 클릭 하 여 해당 코드를 확인 합니다.Add a button named Button1 to the startup form for your project, and then double-click it to view its code. 단추에 대 한 이벤트 처리기가 표시 됩니다.The event handler for the button is displayed.

  2. 추가 된 단추에 Click 대 한 이벤트 처리기에 코드를 추가 하 여 프로시저를 호출 하 고 적절 한 인수를 제공 합니다.Add code to the Click event handler for the button you added, to call the procedure and provide the appropriate arguments:

    Private Sub Button1_Click(ByVal sender As System.Object,
        ByVal e As System.EventArgs) Handles Button1.Click
    
        ' Stores the return value.
        Dim RetVal As Integer
        RetVal = MBox(0, "Declare DLL Test", "Windows API MessageBox",
            MB_ICONQUESTION Or MB_YESNO)
    
        ' Check the return value.
        If RetVal = IDYES Then
            MsgBox("You chose Yes")
        Else
            MsgBox("You chose No")
        End If
    End Sub
    
  3. F5 키를 눌러 프로젝트를 실행 합니다.Run the project by pressing F5. 메시지 상자에 및 응답 없음 단추가 모두 표시 됩니다.The message box is displayed with both Yes and No response buttons. 하나를 클릭 합니다.Click either one.

데이터 마샬링Data Marshaling

Visual Basic는 Windows api 호출에 대 한 매개 변수 및 반환 값의 데이터 형식을 자동으로 변환 하지만, MarshalAs 특성을 사용 하 여 API에 필요한 관리 되지 않는 데이터 형식을 명시적으로 지정할 수 있습니다.Visual Basic automatically converts the data types of parameters and return values for Windows API calls, but you can use the MarshalAs attribute to explicitly specify unmanaged data types that an API expects. Interop 마샬링에 대 한 자세한 내용은 Interop 마샬링을 참조 하세요.For more information about interop marshaling, see Interop Marshaling.

API 호출에서 Declare 및 MarshalAs를 사용 하려면To use Declare and MarshalAs in an API call
  1. 호출 하려는 함수의 이름 및 해당 인수, 데이터 형식 및 반환 값을 결정 합니다.Determine the name of the function you want to call, plus its arguments, data types, and return value.

  2. MarshalAs 특성에 대 한 액세스를 간소화 하려면 다음 Imports 예제와 같이 클래스 또는 모듈에 대 한 코드의 맨 위에 문을 추가 합니다.To simplify access to the MarshalAs attribute, add an Imports statement to the top of the code for the class or module, as in the following example:

    Imports System.Runtime.InteropServices
    
  3. 가져온 함수의 함수 프로토타입을 사용 하는 클래스 또는 모듈에 추가 하 고 MarshalAs 특성을 매개 변수 또는 반환 값에 적용 합니다.Add a function prototype for the imported function to the class or module you are using, and apply the MarshalAs attribute to the parameters or return value. 다음 예제에서는 형식을 void* 예상 하는 API 호출이 다음과 같이 AsAny마샬링됩니다.In the following example, an API call that expects the type void* is marshaled as AsAny:

    Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" (
        ByVal x As Short,
        <MarshalAsAttribute(UnmanagedType.AsAny)>
            ByVal o As Object)
    

DllImport를 사용 하 여 API 호출API Calls Using DllImport

특성 DllImport 은 형식 라이브러리 없이 dll에서 함수를 호출 하는 두 번째 방법을 제공 합니다.The DllImport attribute provides a second way to call functions in DLLs without type libraries. DllImportDeclare 문을 사용 하는 것과 거의 동일 하지만 함수가 호출 되는 방법을 보다 세밀 하 게 제어할 수 있습니다.DllImport is roughly equivalent to using a Declare statement but provides more control over how functions are called.

호출이 shared ( DllImport static이 라고도 함) 메서드를 참조 하는 한 대부분의 Windows API 호출에서을 사용할 수 있습니다.You can use DllImport with most Windows API calls as long as the call refers to a shared (sometimes called static) method. 클래스의 인스턴스를 필요로 하는 메서드는 사용할 수 없습니다.You cannot use methods that require an instance of a class. Declare MarshalAs 문과 달리 호출은특성을사용할수없습니다.DllImportUnlike Declare statements, DllImport calls cannot use the MarshalAs attribute.

DllImport 특성을 사용 하 여 Windows API를 호출 하려면To call a Windows API using the DllImport attribute

  1. 파일 메뉴에서 새로 만들기 를 클릭 한 다음 프로젝트를 클릭 하 여 새 Windows 응용 프로그램 프로젝트를 엽니다.Open a new Windows Application project by clicking New on the File menu, and then clicking Project. 새 프로젝트 대화 상자가 나타납니다.The New Project dialog box appears.

  2. Visual Basic 프로젝트 템플릿 목록에서 Windows 응용 프로그램 을 선택 합니다.Select Windows Application from the list of Visual Basic project templates. 새 프로젝트가 표시 됩니다.The new project is displayed.

  3. 이라는 Button2 단추를 시작 폼에 추가 합니다.Add a button named Button2 to the startup form.

  4. 폼의 코드 Button2 보기를 두 번 클릭 하 여 엽니다.Double-click Button2 to open the code view for the form.

  5. DllImport대 한 액세스를 간소화 하려면 Imports 시작 폼 클래스에 대 한 코드의 맨 위에 문을 추가 합니다.To simplify access to DllImport, add an Imports statement to the top of the code for the startup form class:

    Imports System.Runtime.InteropServices
    
  6. 폼에 대 한 End Class 문 앞에 빈 함수를 선언 하 고 함수 MoveFile이름을로 합니다.Declare an empty function preceding the End Class statement for the form, and name the function MoveFile.

  7. 및 한정자를 함수 선언에 적용 하 고 Windows API 함수 MoveFile 에서 사용 하는 인수에 따라에 대 한 매개 변수를 설정 합니다. Shared PublicApply the Public and Shared modifiers to the function declaration and set parameters for MoveFile based on the arguments the Windows API function uses:

    Public Shared Function MoveFile(
        ByVal src As String,
        ByVal dst As String) As Boolean
        ' Leave the body of the function empty.
    End Function
    

    함수에는 유효한 프로시저 이름이 있을 수 있습니다. 특성 DllImport 은 DLL의 이름을 지정 합니다.Your function can have any valid procedure name; the DllImport attribute specifies the name in the DLL. 또한 매개 변수 및 반환 값에 대 한 상호 운용성 마샬링을 처리 하므로 API에서 사용 하는 데이터 형식과 비슷한 Visual Studio 데이터 형식을 선택할 수 있습니다.It also handles interoperability marshaling for the parameters and return values, so you can choose Visual Studio data types that are similar to the data types the API uses.

  8. 빈 함수에 특성을 적용 합니다. DllImportApply the DllImport attribute to the empty function. 첫 번째 매개 변수는 호출 하는 함수를 포함 하는 DLL의 이름과 위치입니다.The first parameter is the name and location of the DLL containing the function you are calling. Windows 시스템 디렉터리에 있는 파일에 대 한 경로를 지정할 필요가 없습니다.You do not need to specify the path for files located in the Windows system directories. 두 번째 매개 변수는 Windows API에서 함수 이름을 지정 하는 명명 된 인수입니다.The second parameter is a named argument that specifies the name of the function in the Windows API. 이 예제에서 특성은 DllImport 에 대 MoveFile 한 호출이 kernel32.dll에서로 MoveFileW 전달 되도록 합니다. GDIPLUS.DLL.In this example, the DllImport attribute forces calls to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL. 메서드 MoveFileW 는 경로에서 src 경로 dst에 파일을 복사 합니다.The MoveFileW method copies a file from the path src to the path dst.

    <DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True,
        CharSet:=CharSet.Unicode, ExactSpelling:=True,
        CallingConvention:=CallingConvention.StdCall)>
    Public Shared Function MoveFile(
        ByVal src As String,
        ByVal dst As String) As Boolean
        ' Leave the body of the function empty.
    End Function
    
  9. 함수를 호출 하 Button2_Click 는 코드를 이벤트 처리기에 추가 합니다.Add code to the Button2_Click event handler to call the function:

    Private Sub Button2_Click(ByVal sender As System.Object,
        ByVal e As System.EventArgs) Handles Button2.Click
    
        Dim RetVal As Boolean = MoveFile("c:\tmp\Test.txt", "c:\Test.txt")
        If RetVal = True Then
            MsgBox("The file was moved successfully.")
        Else
            MsgBox("The file could not be moved.")
        End If
    End Sub
    
  10. Test.txt 라는 파일을 만들고 하드 드라이브의 C:\Tmp 디렉터리에 넣습니다.Create a file named Test.txt and place it in the C:\Tmp directory on your hard drive. 필요한 경우 Tmp 디렉터리를 만듭니다.Create the Tmp directory if necessary.

  11. F5 키를 눌러 애플리케이션을 시작합니다.Press F5 to start the application. 기본 폼이 나타납니다.The main form appears.

  12. Button2를 클릭 합니다.Click Button2. 파일을 이동할 수 있는 경우 "파일이 성공적으로 이동 되었습니다." 라는 메시지가 표시 됩니다.The message "The file was moved successfully" is displayed if the file can be moved.

참고자료See also