연습: 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.NET Framework 플랫폼을 사용 하 여 수행 됩니다 호출 또는 PInvoke입니다.Because of these differences, and because Windows APIs are not COM objects, interoperability with Windows APIs and the .NET Framework.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. 하나를 사용 하 여 Visual Basic에서 PInvoke를 사용할 수 있습니다는 Declare 문 또는 적용을 DllImport 빈 프로시저에 특성입니다.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. 가능 하면에서 관리 되는 코드를 사용 해야는 .NET Framework.NET Framework Windows API를 호출 하는 대신 작업을 수행 합니다.Whenever possible, you should use managed code from the .NET Framework.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에 대 한 자세한 내용은 플랫폼 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를 사용 하는 상수에 대 한 자세한 내용은 플랫폼 SDK에 포함 된 Windows.h 같은 헤더 파일을 검사 합니다.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. 선택 Windows 응용 프로그램 Visual Basic 프로젝트 템플릿 목록에서.Select Windows Application from the list of Visual Basic project templates. 새 프로젝트가 표시 됩니다.The new project is displayed.

  4. 다음 추가 Declare 클래스 또는 모듈 DLL을 사용 하려는 함수: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 및 별칭 키워드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. 인수를 사용 하 여 마샬링되는 방법을 명시적으로 제어할 수 있습니다.는 MarshalAsAttribute 에 정의 된 특성과 System.Runtime.InteropServices 네임 스페이스입니다.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. 이러한 상수는 숫자 값을 검사 하 여 확인할 수 있습니다는 #define WinUser.h 파일의 문입니다.You can determine the numeric value of these constants by examining the #define statements in the file WinUser.h. 숫자 값 이므로 계산기를 추가 하 고 10 진수로 변환 하는 데 사용할 수 있습니다에 일반적으로 16 진수로 표시 됩니다.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 0x00000030 Yes/스타일이 없습니다 MB_YESNO 0x00000004, 숫자를 추가 하 고 10 진수 0x00000034를 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. 상수 응용 프로그램에서 이러한 값을 선언 하 고 결합 하는 10 진수 결과 직접 사용할 수 있지만 사용 하는 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. 예를 들어 합니다 MessageBox 상수를 사용 하는 API 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. 둘 다와 함께 하는 메시지가 표시 됩니다 하 고 No 응답 단추입니다.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 호출에 선언 하 고 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. 다음 예에서 형식을 예상 하는 API 호출은 void* 으로 마샬링될 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. DllImport 사용 하 여 거의 동일한는 Declare 문은 함수를 호출 하는 방법을 보다 자세히 제어를 제공 하지만 합니다.DllImport is roughly equivalent to using a Declare statement but provides more control over how functions are called.

사용할 수 있습니다 DllImport 대부분의 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. 와 달리 DeclareDllImport 호출을 사용할 수 없습니다는 MarshalAs 특성입니다.Unlike 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. 선택 Windows 응용 프로그램 Visual Basic 프로젝트 템플릿 목록에서.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. 적용 된 Public 하 고 Shared 함수 선언 및 매개 변수를 설정 하는 한정자 MoveFile Windows API 함수를 사용 하 여 인수를 기준으로:Apply 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. 또한 상호 운용성 마샬링 매개 변수를 처리 하 고 반환 값, Visual Studio는 데이터 형식에 데이터와 유사한를 선택할 수 있습니다는 API가 사용 됩니다.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. 적용 된 DllImport 빈 함수에 특성입니다.Apply 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 전달할 MoveFileW KERNEL32에서. 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

DllImportAttribute
MarshalAsAttribute
Declare 문Declare Statement
자동Auto
AliasAlias
COM InteropCOM Interop
관리 코드에서 프로토타입 만들기Creating Prototypes in Managed Code
콜백 메서드로 대리자 마샬링Marshaling a Delegate as a Callback Method