VB.NET 2008/Visual Basic 2008

어셈블리 - Visual Basic에서 Windows API 사용

본클라쓰 2011. 6. 15. 10:57

Windows API는 Windows 운영 체제의 일부인 dll(동적 연결 라이브러리)이다. 직접 프로시저를 작성하기 어려울 때 Windows API를 사용하여 작업을 수행할 수 있다. 예를 들어, Windows가 제공하는 FlashWindowsEx 함수를 사용하여 응용 프로그램의 제목 표시줄을 밝은 음영과 어두운 음영 중에서 선택적으로 표시할 수 있다.

 

Windows API에는 바로 사용할 수 있는 여러 가지 유용한 함수가 포함되어 있기 때문에 이를 코드 작성에 사용하면 개발 시간을 절약할 수 있다는 장점이 있다. 단점은, 문제가 발생할 경우 Windows API는 처리 및 문제 해결에 어려움이 있다는 것이다.

 

Windows API는 특별한 상호 운용성 범주를 나타낸다. Windows API는 관리 코드를 사용하지 않고 형식 라이브러리가 기본 제공되지 않으며 Visual Studio에서 사용되는 것과 다른 데이터 형식을 사용한다. 이러한 차이점은 Windows API는 COM 개체가 아니라는 점 때문에 Windows API와 .NET Framework 사이의 상호 운용성은 플랫폼 호출을 통하여 수행된다. 플랫폼 호출은 관리 코드가, dll로 구현되는 관리되지 않는 함수를 호출할 수 있는 서비스이다.

 

과거에는 Windows API 호출이 Visual Basic 프로그래밍에서 가장 중요한 부분이었으나 Visual Basic 2005에서는 거의 필요하지 않다. 가능하면 항상 Windows API 호출 대신 .NET Framework에서 관리 코드를 사용하여 작업을 수행해야 한다.

 

Windows API를 호출하는 가장 일반적인 방법은 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

 

 

Declare문에서 Auto 한정자는 런타임에 공용 언어 런타임 규칙에 따라 메서드 이름(또는 지정된 경우 별칭 이름)을 기준으로 문자열을 변환하도록 지시한다. Function 키워드 다음에 오는 이름은 사용자 프로그램이 가져온 함수에 액세스하는 데 사용되는 이름이다. 이는 사용자가 호출하는 함수의 실제 이름과 같은 이름일 수도 있고, 올바른 프로시저 이름을 사용한 다음 Alias 키워드를 사용하여 호출하는 함수의 실제 이름을 지정할 수도 있다.

 

lib 키워드 및 그 뒤에 호출하는 함수가 포함된 dll의 이름과 위치를 차례로 지정한다. Windows 시스템 디렉토리에 있는 파일의 경로는 지정하지 않아도 된다.

 

 

 

DllImport를 사용하여 API를 호출할 수도 있다.

 

DllImport 특성을 사용하는 것은 형식 라이브러리 없이 dll에서 함수를 호출하는 두 번째 방법이다. DllImport는 함수의 호출 방법을 보다 잘 제어할 수 있는 것외에는 Declare문과 거의 동일핟.

 

호출이 공유(정적이라고도 함) 메서드를 참조하는 한 대부분의 Windows API 호출에 DllImport를 사용할 수 있다. 클래스 인스턴스를 필요로 하는 메서드는 사용할 수 없다.

 

DllImport 에 쉽게 액세스할 수 있도록 하려면 클래스 코드 맨 위에 Imports 문을 추가한다.

 

Imports System.Runtime.InteropService

 

 

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에 대한 호출이 KERNEL32.DLL 의 MoveFileW로 전달되도록 한다.

 

<DllImport("KERNER32.DLL", EntryPoint:="MoveFileW", SetLastError:=True, CharSet:=CharSet.Unicode, _

ExactSpelling:=True, CallingConvention:=CallingConvension.StdCall)>

Public Shared Function MoveFile(ByVal src As String, ByVal dst As String) As Boolean

' leave the body of the function empty.

End Function

 

 

결국 MoveFile 함수는 첫 번째 매개 변수의 파일을 두 번째 매개 변수의 위치로 복사를 수행한다.