次の方法で共有


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 任意。 次のいずれかを指定できます。

- 公共
- 保護
- 友人
- プライベート
- 保護されたフレンド
- 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 StrictOn場合は必須です。 プロシージャによって返される値のデータ型。

注釈

プロジェクトの外部にあるファイル (DLL やコード リソースなど) で定義されているプロシージャを呼び出す必要がある場合があります。 これを行うと、Visual Basic コンパイラは、プロシージャの場所、識別方法、呼び出しシーケンスと戻り値の型、使用する文字列文字セットなど、プロシージャを正しく呼び出すために必要な情報にアクセスできません。 Declare ステートメントは、外部プロシージャへの参照を作成し、この必要な情報を提供します。

Declareはモジュール レベルでのみ使用できます。 つまり、外部参照の 宣言コンテキスト はクラス、構造体、またはモジュールである必要があり、ソース ファイル、名前空間、インターフェイス、プロシージャ、またはブロックにすることはできません。 詳細については、「 宣言コンテキストと既定のアクセス レベル」を参照してください。

外部参照は既定で パブリック アクセスです。 アクセス修飾子を使用してアクセス レベルを調整できます。

準則

  • 属性。 外部参照に属性を適用できます。 適用する属性は、外部ファイルではなく、プロジェクトでのみ有効です。

  • 修飾子。 外部プロシージャは暗黙的に 共有されます。 外部参照を宣言するときに Shared キーワードを使用することはできません。また、その共有状態を変更することもできません。

    外部プロシージャは、オーバーライドに参加したり、インターフェイス メンバーを実装したり、イベントを処理したりすることはできません。 したがって、Declare ステートメントでは、OverridesOverridableNotOverridableMustOverrideImplements、またはHandlesキーワードを使用することはできません。

  • 外部プロシージャ名。 この外部参照に、その外部ファイル (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 プロシージャへの外部参照を宣言する場合は、Declare ステートメントでShortとして対応する引数を識別する必要があります。これは Visual Basic の 16 ビット整数型であるためです。 同様に、 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修飾子は、すべての文字列を ANSI 値にマーシャリングするように Visual Basic に指示し、Unicode修飾子は、すべての文字列を Unicode 値にマーシャリングするように指示します。 Auto修飾子は、外部参照nameに基づいて.NET Framework の規則に従って文字列をマーシャリングするか、指定した場合はaliasnameするように Visual Basic に指示します。 既定値は Ansi です。

    charsetmodifier また、Visual Basic で外部ファイル内の外部プロシージャを検索する方法も指定します。 AnsiUnicode 両方とも、検索中に名前を変更せずに、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

こちらも参照ください