Declare 문

외부 파일에 구현된 프로시저에 대한 참조를 선언합니다.

구문

[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Overloads ] _
Declare [ charsetmodifier ] [ Sub ] name Lib "libname" _
[ Alias "aliasname" ] [ ([ parameterlist ]) ]
' -or-
[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Overloads ] _
Declare [ charsetmodifier ] [ Function ] name Lib "libname" _
[ Alias "aliasname" ] [ ([ parameterlist ]) ] [ As returntype ]

부분

용어 정의
attributelist 선택 사항. 특성 목록을 참조하세요.
accessmodifier 선택 사항. 다음 중 하나일 수 있습니다.

- 공용
- Protected
- Friend
- 프라이빗
- Protected Friend
- Private Protected

Access levels in Visual Basic을 참조하세요.
Shadows 선택 사항. Shadows를 참조하세요.
charsetmodifier 선택 사항. 문자 집합 및 파일 검색 정보를 지정합니다. 다음 중 하나일 수 있습니다.

- Ansi(기본값)
- Unicode
- 자동
Sub 선택 사항이지만 Sub 또는 Function이 나타나야 합니다. 외부 프로시저가 값을 반환하지 않음을 나타냅니다.
Function 선택 사항이지만 Sub 또는 Function이 나타나야 합니다. 외부 프로시저가 값을 반환함을 나타냅니다.
name 필수입니다. 이 외부 참조의 이름입니다. 자세한 내용은 선언된 요소 이름을 참조하세요.
Lib 필수입니다. 외부 프로시저가 포함된 외부 파일(DLL 또는 코드 리소스)을 식별하는 Lib 절을 소개합니다.
libname 필수입니다. 선언된 프로시저를 포함하는 파일의 이름입니다.
Alias 선택 사항. 선언되는 프로시저를 해당 파일 내에서 name에 지정된 이름으로 식별할 수 없음을 나타냅니다. aliasname에서 해당 ID를 지정합니다.
aliasname Alias 키워드를 사용하는 경우 필수입니다. 다음 두 가지 방법 중 하나로 프로시저를 식별하는 문자열입니다.

파일 내 프로시저의 진입점 이름(따옴표 안에 있음)("")입니다.

또는

숫자 부호(#) + 파일 내에서 프로시저 진입점의 서수를 지정하는 정수
parameterlist 프로시저가 매개 변수를 사용하는 경우 필요합니다. 매개 변수 목록을 참조하세요.
returntype Function이 지정되고 Option StrictOn인 경우 필요합니다. 프로시저에서 반환된 값의 데이터 형식입니다.

설명

경우에 따라 프로젝트 외부의 파일(예: DLL 또는 코드 리소스)에 정의된 프로시저를 호출해야 합니다. 이렇게 할 때 Visual Basic 컴파일러는 프로시저의 위치, 식별 방법, 호출 시퀀스 및 반환 형식, 프로시저가 사용하는 문자열 문자 집합 등 프로시저를 올바르게 호출하는 데 필요한 정보에 액세스할 수 없습니다. Declare 문은 외부 프로시저에 대한 참조를 만들고 이 필수 정보를 제공합니다.

Declare는 모듈 수준에서만 사용할 수 있습니다. 즉, 외부 참조에 대한 선언 컨텍스트는 클래스, 구조체 또는 모듈이어야 하고 원본 파일, 네임스페이스, 인터페이스 또는 블록일 수 없습니다. 자세한 내용은 선언 컨텍스트 및 기본 액세스 수준을 참조하세요.

외부 참조는 기본적으로 공용 액세스로 설정됩니다. 액세스 한정자를 사용하여 액세스 수준을 조정할 수 있습니다.

규칙

  • 특성. 외부 참조에 특성을 적용할 수 있습니다. 적용하는 모든 특성은 외부 파일이 아닌 프로젝트에만 적용됩니다.

  • 한정자. 외부 프로시저는 암시적으로 공유됩니다. 외부 참조를 선언할 때 Shared 키워드를 사용할 수 없으며 공유 상태를 변경할 수 없습니다.

    외부 프로시저는 재정의에 참여하거나 인터페이스 멤버를 구현하거나 이벤트를 처리할 수 없습니다. 따라서, Overrides, Overridable, NotOverridable, MustOverride, Implements 또는 Handles 키워드를 Declare 문에서 사용할 수 없습니다.

  • 외부 프로시저 이름입니다. 외부 파일(aliasname) 내에서 프로시저의 진입점 이름과 동일한 이름을 (name에서) 이 외부 참조에 지정할 필요가 없습니다. Alias 절을 사용하여 진입점 이름을 지정할 수 있습니다. 이것은 외부 프로시저의 이름이 Visual Basic 예약 한정자 또는 변수, 프로시저 또는 동일한 범위의 다른 프로그래밍 요소와 같은 경우 유용할 수 있습니다.

    참고 항목

    대부분의 DLL에서 진입점 이름은 대/소문자를 구분합니다.

  • 외부 프로시저 번호입니다. 또는 Alias 절을 사용하여 외부 파일의 내보내기 테이블 내에서 진입점의 서수를 지정할 수 있습니다. 이렇게 하려면 숫자 부호(#)로 aliasname을 시작합니다. 이것은 Visual Basic에서 외부 프로시저 이름의 문자가 허용되지 않거나 외부 파일이 이름 없이 프로시저를 내보내는 경우에 유용할 수 있습니다.

데이터 형식 규칙

  • 매개 변수 데이터 형식입니다. Option StrictOn인 경우 parameterlist에 각 매개변수의 데이터 형식을 지정해야 합니다. 이것은 모든 데이터 형식이나 열거형, 구조체, 클래스 또는 인터페이스의 이름일 수 있습니다. parameterlist 내에서 As 절을 사용하여 각 매개 변수에 전달할 인수의 데이터 형식을 지정할 수 있습니다.

    참고 항목

    .NET Framework에 대해 외부 프로시저가 작성되지 않은 경우 데이터 형식이 일치하도록 주의해야 합니다. 예를 들어, Integer 매개 변수(Visual Basic 6.0에서는 16비트)를 사용하여 Visual Basic 6.0 프로시저에 대한 외부 참조를 선언하는 경우 이것은 Visual Basic에서 16비트 정수 형식이므로, Declare 문에서 해당 인수를 Short로 식별해야 합니다. 마찬가지로, Long은 Visual Basic 6.0에서 다른 데이터 너비가 다르고 Date가 다르게 구현됩니다.

  • 반환 데이터 형식입니다. 외부 프로시저가 Function이고 Option StrictOn인 경우 호출 코드에 반환되는 값의 데이터 형식을 지정해야 합니다. 이것은 모든 데이터 형식이나 열거형, 구조체, 클래스 또는 인터페이스의 이름일 수 있습니다.

    참고 항목

    Visual Basic 컴파일러는 데이터 형식이 외부 프로시저의 데이터 형식과 호환되는지 확인하지 않습니다. 불일치가 있는 경우 공용 언어 런타임은 런타임에 MarshalDirectiveException 예외를 생성합니다.

  • 기본 데이터 형식입니다. Option StrictOff이고 parameterlist에서 매개 변수의 데이터 형식을 지정하지 않으면 Visual Basic 컴파일러는 해당 인수를 개체 데이터 형식으로 변환합니다. 마찬가지로, returntype을 지정하지 않으면 컴파일러는 반환 데이터 형식을 Object로 지정합니다.

    참고 항목

    다른 플랫폼에서 작성되었을 수 있는 외부 프로시저를 처리하므로 데이터 형식에 대한 가정을 하거나 기본값을 허용하는 것은 위험합니다. 모든 매개 변수의 데이터 형식과 반환 값(있는 경우)의 데이터 형식을 지정하는 것이 훨씬 안전합니다. 이렇게 하면 코드의 가독성도 향상됩니다.

동작

  • 범위. 외부 참조는 클래스, 구조체 또는 모듈 전체의 범위에 있습니다.

  • 수명. 외부 참조의 수명은 선언된 클래스, 구조체 또는 모듈과 동일합니다.

  • 외부 프로시저 호출. Function 또는 Sub 프로시저를 호출하는 방식과 같은 방식으로, 값을 반환하는 경우 식에서 사용하거나 값을 반환하지 않는 경우 Call 문에서 지정하여 외부 프로시저를 호출합니다.

    Declare 문의 parameterlist에 지정된 대로, 외부 프로시저를 인수를 전달합니다. 매개 변수가 원래 외부 파일에서 어떻게 선언되었는지는 고려하지 마세요. 마찬가지로, 반환 값이 있는 경우 Declare 문의 returntype에 지정된 대로 사용합니다.

  • 문자 집합. Visual Basic이 외부 프로시저를 호출할 때 문자열을 마샬링하는 방법을 charsetmodifier에서 지정할 수 있습니다. Ansi 한정자는 Visual Basic에 모든 문자열을 ANSI 값으로 마샬링하도록 지시하고 Unicode, 한정자는 모든 문자열을 유니코드 값으로 마샬링하도록 지시합니다. Auto 한정자는 Visual Basic에 외부 참조 name 또는 aliasname(지정된 경우)에 기반한 .NET Framework 규칙에 따라 문자열을 마샬링하도록 지시합니다. 기본값은 Ansi입니다.

    또한 charsetmodifier는 Visual Basic이 외부 파일 내에서 외부 프로시저를 조회하는 방법도 지정합니다. AnsiUnicode 모두 Visual Basic에 검색 중 이름을 수정하지 않고 조회하도록 지시합니다. Auto는 Visual Basic에 런타임 플랫폼의 기본 문자 집합을 확인하고 다음과 같이 외부 프로시저 이름을 수정하도록 지시합니다.

    • Windows와 같은 유니코드 플랫폼에서 먼저 이름을 수정하지 않고 외부 프로시저를 조회합니다. 실패하면 외부 프로시저 이름의 끝에 "W"를 추가하고 다시 조회합니다.

    • ANSI 플랫폼에서 먼저 이름을 수정하지 않고 외부 프로시저를 조회합니다. 실패하면 외부 프로시저 이름의 끝에 "A"를 추가하고 다시 조회합니다.

  • 메커니즘. Visual Basic은 .NET Framework 플랫폼 호출(PInvoke) 메커니즘을 사용하여 외부 프로시저를 확인하고 액세스합니다. Declare 문과 DllImportAttribute 클래스는 모두 이 메커니즘을 자동으로 사용하므로 PInvoke에 대한 지식은 필요하지 않습니다. 자세한 내용은 연습: Windows API 호출을 참조하세요.

Important

외부 프로시저가 CLR(공용 언어 런타임) 외부에서 실행되는 경우 이것은 안전하지 않은 코드입니다. 이러한 프로시저(예: Windows API 함수 또는 COM 메서드)를 호출하면 애플리케이션이 보안 위험에 노출될 수 있습니다. 자세한 내용은 안전하지 않은 코드에 대한 보안 코딩 지침을 참조하세요.

예 1

다음 예제에서는 현재 사용자 이름을 반환하는 Function 프로시저에 대한 외부 참조를 선언합니다. 그런 다음 GetUserNameA 외부 프로시저를 getUser 프로시저의 부분으로 호출합니다.

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (
    ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
Sub GetUser()
    Dim buffer As String = New String(CChar(" "), 25)
    Dim retVal As Integer = GetUserName(buffer, 25)
    Dim userName As String = Strings.Left(buffer, InStr(buffer, Chr(0)) - 1)
    MsgBox(userName)
End Sub

예제 2

DllImportAttribute는 안전하지 않은 코드에서 함수를 사용하는 다른 방법을 제공합니다. 다음 예제에서는 Declare 문을 사용하지 않고 가져온 함수를 선언합니다.

' Add an Imports statement at the top of the class, structure, or
' module that uses the DllImport attribute.
Imports System.Runtime.InteropServices
<DllImportAttribute("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
    ' This function copies a file from the path src to the path dst.
    ' Leave this function empty. The DLLImport attribute forces calls
    ' to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL.
End Function

참고 항목