다음을 통해 공유


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 선택 사항입니다. 다음 중 하나일 수 있습니다.

- 공공의
- 보호
- 친구
- 민간의
- 보호된 친구
- 프라이빗 보호됨

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

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

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

-또는-

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

비고

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

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

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

규칙

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

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

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

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

    비고

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

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

데이터 형식 규칙

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

    비고

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

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

    비고

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

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

    비고

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

행동

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

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

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

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

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

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

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

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

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

중요합니다

외부 프로시저가 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

참고하십시오