Declare Statement
外部ファイルに実装されているプロシージャへの参照を宣言します。
構文
[ <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 |
任意。 次のいずれかの値を指定します。 - Public - Protected - Friend - Private - Protected Friend - Private Protected 「 Access levels in Visual Basic」を参照してください。 |
Shadows |
任意。 「Shadows」を参照してください。 |
charsetmodifier |
任意。 文字セットとファイル検索情報を指定します。 次のいずれかの値を指定します。 - Ansi (既定値) - Unicode - Auto |
Sub |
省略可能ですが、Sub または Function のいずれかを指定する必要があります。 外部プロシージャが値を返さないことを示します。 |
Function |
省略可能ですが、Sub または Function のいずれかを指定する必要があります。 外部プロシージャが値を返すことを示します。 |
name |
必須です。 この外部参照の名前。 詳細については、「宣言された要素の名前」を参照してください。 |
Lib |
必須です。 外部プロシージャを含む外部ファイル (DLL またはコード リソース) を識別する Lib 句を指定します。 |
libname |
必須です。 宣言されるプロシージャが含まれているファイルの名前。 |
Alias |
任意。 宣言されるプロシージャが、name に指定された名前によってファイル内で識別されないことを示します。 識別は aliasname で指定します。 |
aliasname |
Alias キーワードを使用する場合は必須です。 次の 2 つの方法のいずれかでプロシージャを識別する文字列。ファイル内のプロシージャのエントリ ポイント名 (引用符 ( "" ) で囲む)\- または - 番号記号 ( # ) とそれに続く、ファイル内のプロシージャのエントリ ポイントの序数を指定する整数 |
parameterlist |
プロシージャがパラメーターを受け取る場合は必須です。 「パラメーターの一覧」を参照してください。 |
returntype |
Function が指定され、Option Strict が On の場合は必須です。 プロシージャによって返される値のデータ型。 |
Remarks
プロジェクトの外部のファイル (DLL やコード リソースなど) で定義されたプロシージャを呼び出す必要がある場合があります。 これを行う場合、Visual Basic のコンパイラはプロシージャを正しく呼び出すために必要な情報 (プロシージャがある場所、その識別方法、呼び出しシーケンスと戻り値の型、使用する文字列の文字セットなど) にアクセスできません。 Declare
ステートメントは、外部プロシージャへの参照を作成し、この必要な情報を提供します。
Declare
は、モジュール レベルでのみ使用できます。 つまり、外部参照の宣言コンテキストは、クラス、構造体、またはモジュールである必要があり、ソース ファイル、名前空間、インターフェイス、プロシージャ、またはブロックにすることはできません。 詳細については、「宣言コンテキストと既定のアクセス レベル」を参照してください。
外部参照のアクセスは、既定で Public になります。 アクセス修飾子を使用してこれらのアクセス レベルを調整できます。
ルール
属性。 外部参照には属性を適用できます。 適用した属性は、プロジェクト内でのみ有効になり、外部ファイルには反映されません。
修飾子。 外部プロシージャは、暗黙的に Shared になります。 外部参照の宣言時に
Shared
キーワードを使用することはできません。また、共有ステータスを変更することもできません。外部プロシージャは、オーバーライド、インターフェイス メンバーの実装、またはイベントの処理に関与することはできません。 したがって、
Declare
ステートメントにOverrides
、Overridable
、NotOverridable
、MustOverride
、Implements
、Handles
キーワードを使用することはできません。外部プロシージャ名。 外部ファイル内のプロシージャのエントリ ポイント名 (
aliasname
) と同じ名前をこの外部参照 (name
) に付ける必要はありません。Alias
句を使用して、エントリ ポイント名を指定できます。 これは、外部プロシージャの名前が Visual Basic の予約済みの修飾子や変数、プロシージャ、または同じスコープ内のその他のプログラミング要素と同じである場合に便利です。注意
ほとんどの DLL のエントリ ポイント名では、大文字と小文字が区別されます。
外部プロシージャ番号。 または、
Alias
句を使用して、外部ファイルのエクスポート テーブル内のエントリ ポイントの序数を指定することもできます。 これを行うには、aliasname
を番号記号 (#
) で開始します。 これは、Visual Basic で外部プロシージャ名に使用できない文字がある場合や、外部ファイルによってプロシージャが名前なしでエクスポートされた場合に便利です。
データ型ルール
パラメーターのデータ型。
Option Strict
がOn
の場合は、parameterlist
に各パラメーターのデータ型を指定する必要があります。 任意のデータ型や、列挙、構造体、クラス、またはインターフェイスの名前を指定できます。parameterlist
内でAs
句を使用して、各パラメーターに渡される引数のデータ型を指定します。注意
外部プロシージャが .NET Framework 用に記述されていない場合は、データ型が対応するようにする必要があります。 たとえば、
Integer
のパラメーター (Visual Basic 6.0 では 16 ビット) を持つ Visual Basic 6.0 のプロシージャへの外部参照を宣言する場合は、対応する引数をDeclare
ステートメントでShort
として指定する必要があります。これが Visual Basic の 16 ビット整数型であるためです。 同様に、Visual Basic 6.0 ではLong
のデータ長が異なり、Date
の実装方法も異なります。戻り値のデータ型。 外部プロシージャが
Function
でOption Strict
がOn
の場合は、呼び出し元のコードに返される値のデータ型を指定する必要があります。 任意のデータ型や、列挙、構造体、クラス、またはインターフェイスの名前を指定できます。注意
Visual Basic のコンパイラでは、データ型が外部プロシージャのデータ型と互換性があるかどうかは検証されません。 不一致がある場合は、実行時に共通言語ランタイムによって MarshalDirectiveException 例外が生成されます。
既定のデータ型。
Option Strict
がOff
で、parameterlist
にパラメーターのデータ型が指定されていない場合、Visual Basic コンパイラは、対応する引数を Object データ型に変換します。 同様に、returntype
が指定されていない場合、コンパイラは戻り値のデータ型をObject
にします。注意
別のプラットフォームで記述された可能性がある外部プロシージャを使用しようとしているため、データ型を想定したり、既定値を使用したりすることは危険です。 すべてのパラメーターのデータ型と戻り値 (存在する場合) を指定する方が、はるかに安全です。 これにより、コードも読みやすくなります。
動作
範囲。 外部参照は、そのクラス、構造体、またはモジュール全体をスコープとします。
[Lifetime](有効期間)。 外部参照の有効期間は、宣言されているクラス、構造体、またはモジュールと同じです。
外部プロシージャの呼び出し。 外部プロシージャは、
Function
またはSub
プロシージャを呼び出す場合と同じ方法で呼び出すことができます。値を返す場合は式で使用し、値を返さない場合は Call ステートメントに指定します。引数は、
Declare
ステートメントのparameterlist
に指定したとおりに、外部プロシージャに渡されます。 外部ファイル内でパラメーターが元々どのように宣言されたかは考慮されません。 同様に、戻り値がある場合は、Declare
ステートメントのreturntype
に指定されたとおりに使用されます。文字セット。 外部プロシージャを呼び出すときに Visual Basic が文字列をマーシャリングする方法は
charsetmodifier
に指定できます。Ansi
修飾子は、すべての文字列を ANSI 値にマーシャリングするように Visual Basic に指示し、Unicode
修飾子は、すべての文字列を Unicode 値にマーシャリングするように指示します。Auto
修飾子は、外部参照のname
(または、指定されている場合はaliasname
) に基づいて .NET Framework の規則に従って文字列をマーシャリングするように Visual Basic に指示します。 既定値はAnsi
です。charsetmodifier
は外部ファイル内で Visual Basic が外部プロシージャを検索する方法も指定します。Ansi
とUnicode
は、検索時に名前を変更せずに検索するように Visual Basic に指示し ます。Auto
は、実行時プラットフォームの基本文字セットを判別するように Visual Basic に指示します。また、場合によっては、次のように外部プロシージャ名を変更します。Windows などの Unicode プラットフォームでは、最初に、名前を変更せずに外部プロシージャを検索します。 失敗した場合は、外部プロシージャ名の末尾に "W" を付加して、もう一度検索します。
ANSI プラットフォームでは、最初に、名前を変更せずに外部プロシージャを検索します。 失敗した場合は、外部プロシージャ名の末尾に "A" を付加して、もう一度検索します。
メカニズム。 Visual Basic は、.NET Framework のプラットフォーム呼び出し (PInvoke) メカニズムを使用して、外部プロシージャを解決し、アクセスします。
Declare
ステートメントと DllImportAttribute クラスでは、このメカニズムが自動的に使用されため、PInvoke に関する知識は必要ありません。 詳細については、「チュートリアル:Windows API の呼び出し」を参照してください。
重要
外部プロシージャが共通言語ランタイム (CLR) の外部で実行されている場合は、アンマネージド コードとなります。 このようなプロシージャ (Windows API 関数や COM メソッドなど) を呼び出すと、アプリケーションがセキュリティ上のリスクにさらされる可能性があります。 詳細については、アンマネージド コードの安全なコーディングのガイドラインに関するページを参照してください。
例 1
次の例では、現在のユーザー名を返す Function
プロシージャへの外部参照を宣言しています。 その後、getUser
プロシージャの一部として、外部プロシージャ GetUserNameA
を呼び出します。
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
関連項目
.NET