外部ファイルに実装されているプロシージャへの参照を宣言します。
構文
[ <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 |
任意。 次のいずれかを指定できます。 - 公共 - 保護 - 友人 - プライベート - 保護されたフレンド - 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 で指定された名前でファイル内で識別できないことを示します。 その ID は aliasname で指定します。 |
aliasname |
Alias キーワードを使用する場合は必須です。 次の 2 つの方法のいずれかでプロシージャを識別する文字列。ファイル内のプロシージャのエントリ ポイント名 (引用符 ( "" ) 内)-又は- 番号記号 ( # ) の後に、プロシージャのファイル内のエントリ ポイントの序数を指定する整数が続きます。 |
parameterlist |
プロシージャがパラメーターを受け取る場合は必須。 パラメーター リストに関するページを参照してください。 |
returntype |
Function が指定され、Option Strict がOn 場合は必須です。 プロシージャによって返される値のデータ型。 |
注釈
プロジェクトの外部にあるファイル (DLL やコード リソースなど) で定義されているプロシージャを呼び出す必要がある場合があります。 これを行うと、Visual Basic コンパイラは、プロシージャの場所、識別方法、呼び出しシーケンスと戻り値の型、使用する文字列文字セットなど、プロシージャを正しく呼び出すために必要な情報にアクセスできません。
Declare
ステートメントは、外部プロシージャへの参照を作成し、この必要な情報を提供します。
Declare
はモジュール レベルでのみ使用できます。 つまり、外部参照の 宣言コンテキスト はクラス、構造体、またはモジュールである必要があり、ソース ファイル、名前空間、インターフェイス、プロシージャ、またはブロックにすることはできません。 詳細については、「 宣言コンテキストと既定のアクセス レベル」を参照してください。
外部参照は既定で パブリック アクセスです。 アクセス修飾子を使用してアクセス レベルを調整できます。
準則
属性。 外部参照に属性を適用できます。 適用する属性は、外部ファイルではなく、プロジェクトでのみ有効です。
修飾子。 外部プロシージャは暗黙的に 共有されます。 外部参照を宣言するときに
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 ビット整数型であるためです。 同様に、Long
は Visual Basic 6.0 では異なるデータ幅を持ち、Date
は実装方法が異なります。データ型を返します。 外部プロシージャが
Function
であり、Option Strict
がOn
されている場合は、呼び出し元のコードに返される値のデータ型を指定する必要があります。 これには、任意のデータ型、または列挙型、構造体、クラス、またはインターフェイスの名前を指定できます。注
Visual Basic コンパイラでは、データ型が外部プロシージャと互換性があることを確認しません。 不一致がある場合、共通言語ランタイムは実行時に MarshalDirectiveException 例外を生成します。
既定のデータ型。
Option Strict
がOff
であり、parameterlist
でパラメーターのデータ型を指定しない場合、Visual Basic コンパイラは対応する引数をオブジェクト データ型に変換します。 同様に、returntype
を指定しない場合、コンパイラは戻り値のデータ型をObject
します。注
別のプラットフォームで記述された可能性のある外部プロシージャを処理するため、データ型に関する仮定を行ったり、既定にすることを許可したりすることは危険です。 すべてのパラメーターのデータ型と戻り値 (存在する場合) を指定する方がはるかに安全です。 これにより、コードの読みやすさも向上します。
行動
範囲。 外部参照は、そのクラス、構造体、またはモジュール全体のスコープ内にあります。
一生。 外部参照の有効期間は、宣言されているクラス、構造体、またはモジュールと同じです。
外部プロシージャの呼び出し。 外部プロシージャは、
Function
またはSub
プロシージャを呼び出すのと同じ方法で呼び出します。値を返す場合は式で使用するか、値を返さない場合は Call ステートメント で指定します。Declare
ステートメントでparameterlist
で指定したとおりに、引数を外部プロシージャに渡します。 パラメーターが最初に外部ファイルでどのように宣言されたかを考慮に入れないでください。 同様に、戻り値がある場合は、Declare
ステートメントのreturntype
で指定されたとおりに使用します。文字セット。 Visual Basic が外部プロシージャを呼び出すときに文字列をマーシャリングする方法を
charsetmodifier
で指定できます。Ansi
修飾子は、すべての文字列を ANSI 値にマーシャリングするように Visual Basic に指示し、Unicode
修飾子は、すべての文字列を Unicode 値にマーシャリングするように指示します。Auto
修飾子は、外部参照name
に基づいて.NET Framework の規則に従って文字列をマーシャリングするか、指定した場合はaliasname
するように 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 の呼び出し」を参照してください。
Von Bedeutung
外部プロシージャが共通言語ランタイム (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