場合によっては、プロジェクト外部のファイル (DLL やコード リソースなど) 内で定義されたプロシージャを呼び出すことがあります。このとき、Visual Basic コンパイラは、目的のプロシージャを正しく呼び出すために必要な情報 (プロシージャの定義場所、識別方法、呼び出しシーケンスや戻り値の型、使用される文字セットなど) を知りません。Declare ステートメントは、外部プロシージャへの参照を作成し、この必須情報を提供します。
Declare は、モジュール レベルでのみ使用できます。つまり、外部参照の宣言コンテキストは、クラス、構造体、またはモジュールであることが必要で、ソース ファイル、名前空間、インターフェイス、プロシージャ、ブロックでは宣言できません。詳細については、「宣言コンテキストと既定のアクセス レベル」を参照してください。
外部参照は、既定で Public (Visual Basic) アクセスになります。アクセス修飾子を使用してこれらのアクセス レベルを調整できます。
規則
-
属性 外部参照には属性を適用できます。適用した属性はプロジェクト内でのみ有効であり、外部ファイル内では無効です。
-
修飾子 外部プロシージャは暗黙的に Shared (Visual Basic) になります。外部参照を宣言するときに Shared キーワードを使用することはできません。また、この共有ステータスは変更できません。
外部プロシージャは、オーバーライドに参加したり、インターフェイス メンバを実装したり、イベントを処理したりすることはできません。そのため、Declare ステートメント内では Overrides、Overridable、NotOverridable、MustOverride、Implements、または Handles キーワードを使用できません。
-
外部プロシージャ名 この外部参照の名前 (name) を、外部ファイル内でのプロシージャのエントリ ポイント名 (aliasname) と同じにする必要はありません。エントリ ポイント名を指定するには 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 の場合は、呼び出し元コードに返される値のデータ型を指定する必要があります。任意のデータ型、または列挙体、構造体、クラス、インターフェイスの名前を指定できます。
-
既定のデータ型 Option Strict が Off で、parameterlist 内でパラメータのデータ型を指定していない場合は、Visual Basic コンパイラは対応する引数を オブジェクト型 (Object)に変換します。同様に、returntype を指定していない場合は、コンパイラは戻り値のデータ型を Object にします。
メモ : |
|---|
| 使用しようとする外部プロシージャが別のプラットフォーム上で記述されている可能性もあるので、データ型を憶測で扱ったり、データ型を既定のままにしたりするのは危険です。すべてのパラメータと戻り値 (ある場合) に対してデータ型を指定した方が安全です。こうすると、コードも読みやすくなります。 |
動作
-
スコープ 外部参照のスコープは、そのクラス、構造体、またはモジュール全体になります。
-
有効期間 外部参照の有効期間は、それが宣言されているクラス、構造体、またはモジュールと同じになります。
-
外部プロシージャの呼び出し 外部プロシージャの呼び出し方は、Function または Sub プロシージャを呼び出すときと同じです。つまり、そのプロシージャが値を返す場合は式の中で使用し、値を返さない場合は Call ステートメント (Visual Basic) 内に指定します。
外部プロシージャに引数を渡すときは、Declare ステートメントの parameterlist で指定したとおりに指定します。外部ファイルの中でパラメータがどのように宣言されているかを気にする必要はありません。同様に、戻り値がある場合は、Declare ステートメントの returntype で指定したとおりの方法で使用します。
-
文字セット charsetmodifier では、外部プロシージャを呼び出すときに Visual Basic が文字列をどのようにマーシャリングするかを指定できます。Ansi 修飾子は、すべての文字列を ANSI 値にマーシャリングすることを表します。Unicode 修飾子は、すべての文字列を Unicode 値にマーシャリングすることを表します。Auto 修飾子は、文字列を外部参照の name または aliasname (指定した場合) に基づく .NET Framework の規則に従ってマーシャリングすることを表します。既定値は、Ansi です。
さらに charsetmodifier は、Visual Basic が外部ファイル内で外部プロシージャを検索する方法も表します。Ansi および Unicode を指定した場合は、Visual Basic は検索中に名前を修飾しません。Auto を指定した場合は、Visual Basic は実行時プラットフォームの基本文字セットを調べて、外部プロシージャの名前を次のように修飾します。
-
Windows 95、Windows 98、Windows Millennium Edition などの ANSI プラットフォームでは、まず名前修飾なしで外部プロシージャを検索します。見つからなかった場合は、外部プロシージャ名の末尾に "A" を付けて再度検索します。
-
Windows NT、Windows 2000、Windows XP などの Unicode プラットフォームでは、まず名前修飾なしで外部プロシージャを検索します。見つからなかった場合は、外部プロシージャ名の末尾に "W" を付けて再度検索します。
-
しくみ Visual Basic は、.NET Framework のプラットフォーム呼び出し (PInvoke) 機構を使用して外部プロシージャの解決とアクセスを行います。Declare ステートメントと DllImportAttribute クラスは両方ともこの機構を自動的に使用するので、PInvoke についての知識は必要ありません。詳細については、「チュートリアル : Windows API の呼び出し」を参照してください。
セキュリティに関するメモ : |
|---|
| 共通言語ランタイム (CLR) の外部で実行される外部プロシージャはアンマネージ コードと呼ばれます。たとえば Win32 API 関数や COM メソッドなどが該当しますが、このようなプロシージャを呼び出すとセキュリティ上のリスクが考えられます。詳細については、「アンマネージ コード」を参照してください。 |