Windows API는 Windows 운영 체제의 일부인 DLL(동적 연결 라이브러리)입니다. 동일한 프로시저를 직접 작성하기 어려운 경우 작업을 수행하는 데 사용합니다. 예를 들어 Windows는 밝은 음영과 어두운 색조를 번갈아 애플리케이션에 대한 제목 표시줄을 만들 수 있는 명명된 FlashWindowEx
함수를 제공합니다.
코드에서 Windows API를 사용하는 이점은 이미 작성되고 사용되기를 기다리는 수십 개의 유용한 함수가 포함되어 있으므로 개발 시간을 절약할 수 있다는 것입니다. 단점은 문제가 발생할 때 Windows API로 작업하기 어렵고 용서하기 어려울 수 있다는 것입니다.
Windows API는 상호 운용성의 특별한 범주를 나타냅니다. Windows API는 관리 코드를 사용하지 않으며, 기본 제공 형식 라이브러리가 없으며, Visual Studio에서 사용되는 것과 다른 데이터 형식을 사용합니다. 이러한 차이 때문에 Windows API는 COM 개체가 아니므로 Windows API 및 .NET Framework와의 상호 운용성은 플랫폼 호출 또는 PInvoke를 사용하여 수행됩니다. 플랫폼 호출은 관리 코드가 DLL에 구현된 관리되지 않는 함수를 호출할 수 있도록 하는 서비스입니다. 자세한 내용은 관리되지 않는 DLL 함수를 사용하는 것을 참조하세요. Visual Basic에서 PInvoke를 사용하려면 Declare
문을 사용하거나 빈 프로시저에 DllImport
특성을 적용할 수 있습니다.
Windows API 호출은 과거에 Visual Basic 프로그래밍의 중요한 부분이었지만 Visual Basic .NET에서는 거의 필요하지 않습니다. 가능하면 Windows API 호출 대신 .NET Framework의 관리 코드를 사용하여 작업을 수행해야 합니다. 이 안내서는 Windows API를 사용하는 것이 필요한 상황에 대한 정보를 제공합니다.
비고
컴퓨터는 다음 지침에서 Visual Studio 사용자 인터페이스 요소 중 일부에 대해 다른 이름 또는 위치를 표시할 수 있습니다. 가지고 있는 Visual Studio 버전과 사용하는 설정에 따라 이러한 요소가 결정됩니다. 자세한 내용은 IDE 개인 설정참조하세요.
선언을 사용하여 API 호출
Windows API를 호출하는 가장 일반적인 방법은 문을 사용하는 것입니다 Declare
.
DLL 프로시저를 선언하려면
호출할 함수의 이름과 해당 인수, 인수 형식 및 반환 값뿐만 아니라 함수를 포함하는 DLL의 이름과 위치를 결정합니다.
비고
Windows API에 대한 자세한 내용은 플랫폼 SDK Windows API의 Win32 SDK 설명서를 참조하세요. Windows API에서 사용하는 상수에 대한 자세한 내용은 플랫폼 SDK에 포함된 Windows.h와 같은 헤더 파일을 검사합니다.
파일 메뉴에서 새로 만들기를 클릭하고 프로젝트를 클릭하여 새 Windows 애플리케이션 프로젝트를 시작합니다. 새 프로젝트 대화 상자가 나타납니다.
Visual Basic 프로젝트 템플릿 목록에서 Windows 애플리케이션 을 선택합니다. 새 프로젝트가 표시됩니다.
DLL을 사용하려는 클래스 또는 모듈에 다음
Declare
함수를 추가합니다.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
디클레어 문(statement)의 일부
이 문장에는 Declare
다음 요소가 포함됩니다.
자동 수정자
Auto
한정자는 공용 언어 런타임 규칙에 따라 메서드 이름(또는 지정된 경우 별칭 이름)에 따라 문자열을 변환하도록 런타임에 지시합니다.
Lib 및 별칭 키워드
키워드 다음 Function
의 이름은 프로그램에서 가져온 함수에 액세스하는 데 사용하는 이름입니다. 호출하는 함수의 실제 이름과 같거나 유효한 프로시저 이름을 사용한 다음 키워드를 사용하여 Alias
호출하는 함수의 실제 이름을 지정할 수 있습니다.
키워드를 Lib
지정한 다음, 호출하는 함수가 포함된 DLL의 이름과 위치를 지정합니다. Windows 시스템 디렉터리에 있는 파일의 경로를 지정할 필요가 없습니다.
Alias
호출하는 함수의 이름이 유효한 Visual Basic 프로시저 이름이 아니거나 애플리케이션의 다른 항목 이름과 충돌하는 경우 키워드를 사용합니다.
Alias
는 호출되는 함수의 실제 이름을 나타냅니다.
인수 및 데이터 형식 선언
인수 및 해당 데이터 형식을 선언합니다. Windows에서 사용하는 데이터 형식이 Visual Studio 데이터 형식에 해당하지 않으므로 이 부분은 어려울 수 있습니다. Visual Basic은 인수를 마샬링이라는 프로세스인 호환되는 데이터 형식으로 변환하여 많은 작업을 수행합니다. MarshalAsAttribute 네임스페이스에 정의된 System.Runtime.InteropServices 특성을 사용하여 인수가 마샬링되는 방법을 명시적으로 제어할 수 있습니다.
비고
이전 버전의 Visual Basic에서는 매개 변수 As Any
를 선언할 수 있습니다. 즉, 모든 데이터 형식의 데이터를 사용할 수 있습니다. Visual Basic에서는 모든 Declare
문에 특정 데이터 형식을 사용해야 합니다.
Windows API 상수
일부 인수는 상수의 조합입니다. 예를 들어, 이 예시에서 MessageBox
API는 메시지 상자가 표시되는 방식을 제어하는 Typ
이라는 정수 인수를 허용합니다. WinUser.h 파일의 문을 검사하여 이러한 상수의 #define
숫자 값을 확인할 수 있습니다. 숫자 값은 일반적으로 16진수로 표시되므로 계산기를 사용하여 값을 추가하고 10진수로 변환할 수 있습니다. 예를 들어 느낌표 스타일 MB_ICONEXCLAMATION
0x00000030 대한 상수와 예/아니요 스타일 MB_YESNO
0x00000004 결합하려는 경우 숫자를 추가하고 0x00000034 결과 또는 52진수를 가져올 수 있습니다. 소수점 결과를 직접 사용할 수 있지만 이러한 값을 애플리케이션에서 상수로 선언하고 연산자를 사용하여 Or
결합하는 것이 좋습니다.
Windows API 호출에 대한 상수 선언
호출하는 Windows 함수에 대한 설명서를 참조하세요. 사용하는 상수의 이름과 이러한 상수의 숫자 값이 포함된 .h 파일의 이름을 결정합니다.
메모장과 같은 텍스트 편집기를 사용하여 헤더(.h) 파일의 내용을 보고 사용 중인 상수와 연결된 값을 찾습니다. 예를 들어 API는
MessageBox
상수MB_ICONQUESTION
로 메시지 상자에 물음표를 표시합니다. 정의MB_ICONQUESTION
는 WinUser.h에 있으며 다음과 같이 표시됩니다.#define MB_ICONQUESTION 0x00000020L
클래스 또는 모듈에 해당하는
Const
문을 추가하여 이러한 상수를 애플리케이션에서 사용할 수 있도록 합니다. 다음은 그 예입니다.Const MB_ICONQUESTION As Integer = &H20 Const MB_YESNO As Integer = &H4 Const IDYES As Integer = 6 Const IDNO As Integer = 7
DLL 프로시저를 호출하려면
프로젝트의 시작 폼에 명명된
Button1
단추를 추가한 다음 두 번 클릭하여 해당 코드를 봅니다. 단추의 이벤트 처리기가 표시됩니다.추가한 단추에
Click
대한 이벤트 처리기에 코드를 추가하여 프로시저를 호출하고 적절한 인수를 제공합니다.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
F5 키를 눌러 프로젝트를 실행합니다. 메시지 상자에는 예 및 아니요 응답 단추가 모두 표시됩니다. 둘 중 하나를 클릭합니다.
데이터 마샬링
Visual Basic은 Windows API 호출에 대한 매개 변수 및 반환 값의 데이터 형식을 자동으로 변환하지만 이 특성을 사용하여 MarshalAs
API에서 기대하는 관리되지 않는 데이터 형식을 명시적으로 지정할 수 있습니다. interop 마샬링에 대한 자세한 내용은 Interop 마샬링을 참조하세요.
API 호출에서 Declare 및 MarshalA를 사용하려면
호출할 함수의 이름과 해당 인수, 데이터 형식 및 반환 값을 결정합니다.
클래스나 모듈의 코드 맨 위에
MarshalAs
문을 추가하여Imports
속성에 대한 액세스를 간소화하십시오. 다음 예를 참조하십시오.Imports System.Runtime.InteropServices
가져온 함수의 함수 프로토타입을 사용 중인 클래스 또는 모듈에 추가하고 매개 변수 또는 반환 값에 특성을 적용
MarshalAs
합니다. 다음 예제에서는 형식void*
을 예상하는 API 호출이 다음과 같이AsAny
마샬링됩니다.Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" ( ByVal x As Short, <MarshalAsAttribute(UnmanagedType.AsAny)> ByVal o As Object)
DllImport를 사용하는 API 호출
이 특성은 DllImport
형식 라이브러리가 없는 DLL에서 함수를 호출하는 두 번째 방법을 제공합니다.
DllImport
은 문을 사용하는 Declare
것과 거의 동일하지만 함수가 호출되는 방식을 보다 효율적으로 제어할 수 있습니다.
호출이 공유(DllImport
메서드라고도 함)를 참조하는 한 대부분의 Windows API 호출에서 사용할 수 있습니다. 클래스의 인스턴스가 필요한 메서드는 사용할 수 없습니다.
Declare
문과 달리 DllImport
호출은 MarshalAs
특성을 사용할 수 없습니다.
DllImport 특성을 사용하여 Windows API를 호출하려면
파일 메뉴에서 새로 만들기를 클릭하고 프로젝트를 클릭하여 새 Windows 애플리케이션 프로젝트를 시작합니다. 새 프로젝트 대화 상자가 나타납니다.
Visual Basic 프로젝트 템플릿 목록에서 Windows 애플리케이션 을 선택합니다. 새 프로젝트가 표시됩니다.
시작 폼에 명명된
Button2
단추를 추가합니다.폼의 코드 보기를 열려면 두 번 클릭합니다
Button2
.시작 양식 클래스에 대한 코드의 맨 위에
DllImport
문을 추가하여Imports
에 대한 액세스를 간소화하십시오.Imports System.Runtime.InteropServices
폼의 문 앞에
End Class
빈 함수를 선언하고 함수MoveFile
이름을 지정합니다.함수 선언에
Public
및Shared
한정자를 적용하고 Windows API 함수에서 사용하는 인수에 따라 매개 변수MoveFile
를 설정합니다.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의 이름을 지정합니다. 또한 매개 변수 및 반환 값에 대한 상호 운용성 마샬링을 처리하므로 API에서 사용하는 데이터 형식과 유사한 Visual Studio 데이터 형식을 선택할 수 있습니다.빈 함수에
DllImport
특성을 적용합니다. 첫 번째 매개 변수는 호출하는 함수를 포함하는 DLL의 이름과 위치입니다. Windows 시스템 디렉터리에 있는 파일의 경로를 지정할 필요가 없습니다. 두 번째 매개 변수는 Windows API에서 함수의 이름을 지정하는 명명된 인수입니다. 이 예제에서DllImport
특성은MoveFile
호출을 강제로MoveFileW
로 KERNEL32.DLL에 전달합니다. 메서드는MoveFileW
경로에서 경로src
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
이벤트 처리기에 함수를
Button2_Click
호출하는 코드를 추가합니다.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
Test.txt 파일을 만들고 하드 드라이브의 C:\Tmp 디렉터리에 배치합니다. 필요한 경우 Tmp 디렉터리를 만듭니다.
F5 키를 눌러 애플리케이션을 시작합니다. 기본 폼이 나타납니다.
단추2를 클릭합니다. 파일을 이동할 수 있으면 "파일이 성공적으로 이동되었습니다."라는 메시지가 표시됩니다.
참고하십시오
.NET