Declare ステートメントDeclare Statement

外部ファイルに実装されているプロシージャへの参照を宣言します。Declares a reference to a procedure implemented in an external file.

構文Syntax

[ <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 ]

指定項目Parts

用語Term DefinitionDefinition
attributelist 省略可。Optional. 属性リスト」を参照してください。See Attribute List.
accessmodifier 省略可。Optional. 次のいずれかになります。Can be one of the following:

- Public- Public
- Protected- Protected
- Friend- Friend
- Private- Private
- Protected Friend- Protected Friend
- Private Protected- Private Protected

Visual Basic でのアクセス レベル」を参照してください。See Access levels in Visual Basic.
Shadows 省略可。Optional. Shadows」を参照してください。See Shadows.
charsetmodifier 省略可。Optional. 文字セットとファイル検索情報を指定します。Specifies character set and file search information. 次のいずれかになります。Can be one of the following:

- Ansi (既定値)- Ansi (default)
- Unicode- Unicode
- Auto- Auto
Sub 省略可能ですが、Sub または Function のいずれかが表示されている必要があります。Optional, but either Sub or Function must appear. 外部プロシージャが値を返さないことを示します。Indicates that the external procedure does not return a value.
Function 省略可能ですが、Sub または Function のいずれかが表示されている必要があります。Optional, but either Sub or Function must appear. 外部プロシージャが値を返すことを示します。Indicates that the external procedure returns a value.
name 必須。Required. この外部参照の名前です。Name of this external reference. 詳細については、「宣言された要素の名前」を参照してください。For more information, see Declared Element Names.
Lib 必須。Required. では、外部プロシージャを含む外部ファイル (DLL またはコードリソース) を識別する Lib 句が導入されています。Introduces a Lib clause, which identifies the external file (DLL or code resource) that contains an external procedure.
libname 必須。Required. 宣言されたプロシージャを含むファイルの名前。Name of the file that contains the declared procedure.
Alias 省略可。Optional. 宣言されているプロシージャが、nameで指定された名前によってファイル内で識別されないことを示します。Indicates that the procedure being declared cannot be identified within its file by the name specified in name. Id は aliasnameで指定します。You specify its identification in aliasname.
aliasname Alias キーワードを使用する場合は必須です。Required if you use the Alias keyword. 次の2つの方法のいずれかでプロシージャを識別する文字列。String that identifies the procedure in one of two ways:

ファイル内のプロシージャのエントリポイント名 (引用符 (""))The entry point name of the procedure within its file, within quotes ("")

または-or-

ファイル内のプロシージャのエントリポイントの序数を指定する整数の後にシャープ記号 (#)A number sign (#) followed by an integer specifying the ordinal number of the procedure's entry point within its file
parameterlist プロシージャがパラメーターを受け取る場合は必須です。Required if the procedure takes parameters. パラメーターリスト」を参照してください。See Parameter List.
returntype Function が指定され、Option StrictOn場合は必須です。Required if Function is specified and Option Strict is On. プロシージャによって返される値のデータ型。Data type of the value returned by the procedure.

コメントRemarks

場合によっては、プロジェクト外のファイル (DLL やコードリソースなど) で定義されたプロシージャを呼び出す必要があります。Sometimes you need to call a procedure defined in a file (such as a DLL or code resource) outside your project. この場合、プロシージャが配置されている場所、その識別方法、呼び出し元のシーケンスと戻り値の型、および使用する文字列文字セットなど、プロシージャを正しく呼び出すために必要な情報には、Visual Basic コンパイラがアクセスできません。When you do this, the Visual Basic compiler does not have access to the information it needs to call the procedure correctly, such as where the procedure is located, how it is identified, its calling sequence and return type, and the string character set it uses. Declare ステートメントは、外部プロシージャへの参照を作成し、この必要な情報を提供します。The Declare statement creates a reference to an external procedure and supplies this necessary information.

Declare は、モジュール レベルでのみ使用できます。You can use Declare only at module level. つまり、外部参照の宣言コンテキストは、クラス、構造体、またはモジュールである必要があり、ソースファイル、名前空間、インターフェイス、プロシージャ、またはブロックにすることはできません。This means the declaration context for an external reference must be a class, structure, or module, and cannot be a source file, namespace, interface, procedure, or block. 詳細については、「宣言コンテキストと既定のアクセス レベル」を参照してください。For more information, see Declaration Contexts and Default Access Levels.

外部参照では、既定でPublicアクセスが使用されます。External references default to Public access. アクセス修飾子を使用してこれらのアクセス レベルを調整できます。You can adjust their access levels with the access modifiers.

ルールRules

  • アトリビュート.Attributes. 外部参照に属性を適用できます。You can apply attributes to an external reference. 適用した属性は、プロジェクト内でのみ有効になり、外部ファイルには反映されません。Any attribute you apply has effect only in your project, not in the external file.

  • ド.Modifiers. 外部プロシージャは暗黙的にSharedされます。External procedures are implicitly Shared. 外部参照を宣言するときに Shared キーワードを使用することはできません。また、共有ステータスを変更することもできません。You cannot use the Shared keyword when declaring an external reference, and you cannot alter its shared status.

    外部プロシージャは、オーバーライド、インターフェイスメンバーの実装、またはイベントの処理に関与することはできません。An external procedure cannot participate in overriding, implement interface members, or handle events. したがって、Implementsステートメントで OverridesOverridableNotOverridableMustOverrideHandles、または Declare キーワードを使用することはできません。Accordingly, you cannot use the Overrides, Overridable, NotOverridable, MustOverride, Implements, or Handles keyword in a Declare statement.

  • 外部プロシージャ名。External Procedure Name. 外部ファイル (aliasname) 内のプロシージャのエントリポイント名と同じ名前 (name) をこの外部参照に与える必要はありません。You do not have to give this external reference the same name (in name) as the procedure's entry-point name within its external file (aliasname). Alias 句を使用して、エントリポイント名を指定できます。You can use an Alias clause to specify the entry-point name. これは、外部プロシージャの名前が Visual Basic 予約済みの修飾子、変数、プロシージャ、または同じスコープ内のその他のプログラミング要素と同じである場合に便利です。This can be useful if the external procedure has the same name as a Visual Basic reserved modifier or a variable, procedure, or any other programming element in the same scope.

    注意

    ほとんどの Dll のエントリポイント名は大文字と小文字が区別されます。Entry-point names in most DLLs are case-sensitive.

  • 外部プロシージャ番号。External Procedure Number. または、Alias 句を使用して、外部ファイルのエクスポートテーブル内のエントリポイントの序数を指定することもできます。Alternatively, you can use an Alias clause to specify the ordinal number of the entry point within the export table of the external file. これを行うには、番号記号 (#) を使用して aliasname を開始します。To do this, you begin aliasname with a number sign (#). これは、Visual Basic で外部プロシージャ名に使用できない文字がある場合や、外部ファイルによってプロシージャが名前なしでエクスポートされた場合に便利です。This can be useful if any character in the external procedure name is not allowed in Visual Basic, or if the external file exports the procedure without a name.

データ型ルールData Type Rules

  • パラメーターのデータ型。Parameter Data Types. Option StrictOn場合は parameterlistで各パラメーターのデータ型を指定する必要があります。If Option Strict is On, you must specify the data type of each parameter in parameterlist. 任意のデータ型、または列挙体、構造体、クラス、またはインターフェイスの名前を指定できます。This can be any data type or the name of an enumeration, structure, class, or interface. parameterlist内では、As 句を使用して、各パラメーターに渡される引数のデータ型を指定します。Within parameterlist, you use an As clause to specify the data type of the argument to be passed to each parameter.

    注意

    .NET Framework に対して外部プロシージャが記述されていない場合は、データ型が対応していることに注意する必要があります。If the external procedure was not written for the .NET Framework, you must take care that the data types correspond. たとえば、Integer パラメーター (Visual Basic 6.0 で16ビット) を使用して Visual Basic 6.0 プロシージャへの外部参照を宣言する場合は、Declare の16ビット整数型であるため、対応する引数を Visual Basic ステートメントで Short として指定する必要があります。For example, if you declare an external reference to a Visual Basic 6.0 procedure with an Integer parameter (16 bits in Visual Basic 6.0), you must identify the corresponding argument as Short in the Declare statement, because that is the 16-bit integer type in Visual Basic. 同様に、Long のデータ幅は Visual Basic 6.0 で異なり、Date の実装方法も異なります。Similarly, Long has a different data width in Visual Basic 6.0, and Date is implemented differently.

  • 戻り値のデータ型。Return Data Type. 外部プロシージャが FunctionOption StrictOn場合は、呼び出し元のコードに返される値のデータ型を指定する必要があります。If the external procedure is a Function and Option Strict is On, you must specify the data type of the value returned to the calling code. 任意のデータ型、または列挙体、構造体、クラス、またはインターフェイスの名前を指定できます。This can be any data type or the name of an enumeration, structure, class, or interface.

    注意

    Visual Basic コンパイラでは、データ型が外部プロシージャのデータ型と互換性があるかどうかは検証されません。The Visual Basic compiler does not verify that your data types are compatible with those of the external procedure. 不一致がある場合は、実行時に共通言語ランタイムによって MarshalDirectiveException 例外が生成されます。If there is a mismatch, the common language runtime generates a MarshalDirectiveException exception at run time.

  • 既定のデータ型。Default Data Types. Option StrictOffparameterlistでパラメーターのデータ型を指定していない場合、Visual Basic コンパイラは対応する引数をObject データ型に変換します。If Option Strict is Off and you do not specify the data type of a parameter in parameterlist, the Visual Basic compiler converts the corresponding argument to the Object Data Type. 同様に、returntypeを指定しない場合、コンパイラは戻り値のデータ型を Objectします。Similarly, if you do not specify returntype, the compiler takes the return data type to be Object.

    注意

    別のプラットフォームに記述されている可能性がある外部プロシージャを扱うため、データ型についての想定を作成したり、既定値を許可したりすることは危険です。Because you are dealing with an external procedure that might have been written on a different platform, it is dangerous to make any assumptions about data types or to allow them to default. すべてのパラメーターのデータ型と戻り値 (存在する場合) を指定する方が、はるかに安全です。It is much safer to specify the data type of every parameter and of the return value, if any. これにより、コードの読みやすさも向上します。This also improves the readability of your code.

動作Behavior

  • 検索.Scope. 外部参照は、そのクラス、構造体、またはモジュール全体でスコープ内にあります。An external reference is in scope throughout its class, structure, or module.

  • 最短.Lifetime. 外部参照の有効期間は、宣言されているクラス、構造体、またはモジュールと同じです。An external reference has the same lifetime as the class, structure, or module in which it is declared.

  • 外部プロシージャの呼び出し。Calling an External Procedure. 外部プロシージャは、Function または Sub プロシージャを呼び出すのと同じ方法で、値を返す場合は式で使用するか、値を返さない場合は Call ステートメントで指定することによって呼び出します。You call an external procedure the same way you call a Function or Sub procedure—by using it in an expression if it returns a value, or by specifying it in a Call Statement if it does not return a value.

    引数は、Declare ステートメントの parameterlist で指定されたとおりに、外部プロシージャに渡すことができます。You pass arguments to the external procedure exactly as specified by parameterlist in the Declare statement. パラメーターが外部ファイル内で最初に宣言された方法を考慮しないでください。Do not take into account how the parameters were originally declared in the external file. 同様に、戻り値がある場合は、Declare ステートメントの returntype で指定されたとおりに使用します。Similarly, if there is a return value, use it exactly as specified by returntype in the Declare statement.

  • 文字セット。Character Sets. 外部プロシージャを呼び出すときに Visual Basic が文字列をマーシャリングする方法 charsetmodifier でを指定できます。You can specify in charsetmodifier how Visual Basic should marshal strings when it calls the external procedure. Ansi 修飾子は、すべての文字列を ANSI 値にマーシャリングするように Visual Basic に指示し、Unicode 修飾子は、すべての文字列を Unicode 値にマーシャリングするように指示します。The Ansi modifier directs Visual Basic to marshal all strings to ANSI values, and the Unicode modifier directs it to marshal all strings to Unicode values. Auto 修飾子は、外部参照 nameに基づいて .NET Framework 規則に従って文字列をマーシャリングするように Visual Basic に指示します。または、指定されている場合は aliasname します。The Auto modifier directs Visual Basic to marshal strings according to .NET Framework rules based on the external reference name, or aliasname if specified. 既定値は Ansi です。The default value is Ansi.

    また、外部ファイル内で外部プロシージャを検索 Visual Basic 方法も指定 charsetmodifier ます。charsetmodifier also specifies how Visual Basic should look up the external procedure within its external file. 検索中に名前を変更することなく、直接 Visual Basic を検索するように、両方を Ansi および Unicode ます。Ansi and Unicode both direct Visual Basic to look it up without modifying its name during the search. Auto は、次のように、ランタイムプラットフォームの基本文字セットを決定するために Visual Basic に指示します。また、場合によっては外部プロシージャ名を変更します。Auto directs Visual Basic to determine the base character set of the run-time platform and possibly modify the external procedure name, as follows:

    • Windows 95、Windows 98、または Windows Millennium Edition などの ANSI プラットフォームでは、最初に名前を変更せずに外部プロシージャを検索します。On an ANSI platform, such as Windows 95, Windows 98, or Windows Millennium Edition, first look up the external procedure with no name modification. 失敗した場合は、外部プロシージャ名の末尾に "A" を追加して、もう一度確認します。If that fails, append "A" to the end of the external procedure name and look it up again.

    • Windows NT、Windows 2000、Windows XP などの Unicode プラットフォームでは、最初に名前を変更せずに外部プロシージャを検索します。On a Unicode platform, such as Windows NT, Windows 2000, or Windows XP, first look up the external procedure with no name modification. 失敗した場合は、外部プロシージャ名の末尾に "W" を追加して、もう一度確認します。If that fails, append "W" to the end of the external procedure name and look it up again.

  • しくみ.Mechanism. Visual Basic は、.NET Framework platform invoke (PInvoke) メカニズムを使用して、外部プロシージャを解決し、アクセスします。Visual Basic uses the .NET Framework platform invoke (PInvoke) mechanism to resolve and access external procedures. Declare ステートメントと DllImportAttribute クラスは、どちらもこのメカニズムを自動的に使用します。 PInvoke に関する知識は必要ありません。The Declare statement and the DllImportAttribute class both use this mechanism automatically, and you do not need any knowledge of PInvoke. 詳細については、「チュートリアル: Windows api の呼び出し」を参照してください。For more information, see Walkthrough: Calling Windows APIs.

重要

外部プロシージャが共通言語ランタイム (CLR) の外部で実行されている場合は、アンマネージコードです。If the external procedure runs outside the common language runtime (CLR), it is unmanaged code. このようなプロシージャ (Windows API 関数や COM メソッドなど) を呼び出すと、アプリケーションがセキュリティ上のリスクにさらされる可能性があります。When you call such a procedure, for example a Windows API function or a COM method, you might expose your application to security risks. 詳細については、「アンマネージコードの安全なコーディングのガイドライン」を参照してください。For more information, see Secure Coding Guidelines for Unmanaged Code.

Example

次の例では、現在のユーザー名を返す Function プロシージャへの外部参照を宣言しています。The following example declares an external reference to a Function procedure that returns the current user name. 次に、getUser プロシージャの一部として、外部プロシージャ GetUserNameA を呼び出します。It then calls the external procedure GetUserNameA as part of the getUser procedure.

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

Example

DllImportAttribute には、アンマネージコードで関数を使用する別の方法が用意されています。The DllImportAttribute provides an alternative way of using functions in unmanaged code. 次の例では、Declare ステートメントを使用せずにインポートされた関数を宣言します。The following example declares an imported function without using a Declare statement.

' 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

参照See also