プラットフォーム呼び出しの技術サンプル
更新 : 2007 年 11 月
この例では、アンマネージ ライブラリからエクスポートした関数の呼び出しに使用する手法の例を示します。内容は次のとおりです。
さまざまな型の宣言
使用可能な属性を使用した既定動作の変更
Marshal 型のメソッドの使用
ガベージ コレクションおよびスレッド処理のどちらが結果に影響を与えるかの判断
サンプルには、Windows ライブラリからエクスポートされた関数を使用するものや、カスタム ライブラリからエクスポートした関数を使用するものがあります。また、Windows プラットフォームでは使用できないライブラリを使用するものや、Windows プラットフォームではサポートされていない方法で関数を使用するものもあります。ただし、このサンプルで使用されている特定のプラットフォーム呼び出し規則の理解を妨げるものではありません。
サンプルのディレクトリ構造を次に示します。
ディレクトリ |
内容 |
---|---|
WinAPIs |
Windows ライブラリからエクスポートされた関数を使用したプラットフォーム呼び出しの例 |
WinAPIs\CS |
C# で記述されたソース コード |
WinAPIs\VB |
Visual Basic で記述されたソース コード |
Custom |
カスタム タイプ ライブラリからエクスポートされた関数を使用したプラットフォーム呼び出しの例 |
Custom\CS |
C# で記述されたソース コード |
Custom\LIB |
カスタム タイプ ライブラリのソース コード |
Custom\VB |
VB で記述されたソース コード |
このサンプルの使用については、次のトピックを参照してください。
コマンド プロンプトを使用してサンプルをビルドするには
コマンド プロンプト ウィンドウを開き、使用言語に対応するサブディレクトリに移動します。
コマンド ラインで「msbuild [ファイル名].sln」と入力します。
メモ : Custom プラットフォーム呼び出しのサンプルは、Visual Studio でのみビルドできます。
Visual Studio を使用してサンプルをビルドするには
Windows エクスプローラを開き、使用言語に対応するサブディレクトリに移動します。
[ファイル名].sln のアイコンをダブルクリックして、そのファイルを Visual Studio で開きます。
[ビルド] メニューの [ソリューションのビルド] をクリックします。
サンプルを実行するには
WinAPIs ディレクトリまたは Custom ディレクトリで、ビルドされた実行可能ファイルを含む、使用言語に対応するディレクトリに移動します。
コマンド ラインで、目的の実行可能ファイル名を入力します。
メモ : このサンプルでは、コンソール アプリケーションをビルドします。出力を表示するには、それぞれを別個にコマンド プロンプトで実行する必要があります。
必要条件
これらのサンプルには、Windows ヘッダーが必要です。プロジェクトで Windows ヘッダーを参照できるようにするには、Microsoft Visual Studio 2005 の [Visual Studio 2005 コマンド プロンプト] を使用してビルドするか、プラットフォーム SDK をインストールしてインクルード パスに指定します。
解説
次の表に、各サンプルが示すトピック、およびその実例となるサンプルのソース ファイルの格納場所を示します。
プラットフォーム呼び出し属性の使用方法
属性 |
説明 |
サンプル |
---|---|---|
EntryPoint |
マネージ コードで使用するために関数名を変更します。 |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
CharSet |
文字列のマーシャリング方法を選択します。関数名の検索条件にも影響します。 |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
ExactSpelling |
アンマネージ DLL のエントリ ポイント名を変更して CharSet 値に対応させる必要があるかどうかを示します。 |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
CallingConvention |
vararg を使って関数を呼び出します。 |
WinAPIs\CS\Printf.cs WinAPIs\VB\Printf.vb |
PreserveSig |
HRESULT を返す関数を変更します。 |
WinAPIs\CS\CreateObject.cs WinAPIs\VB\CreateObject.vb |
SetLastError |
関数呼び出しの後にエラー コードが保存されることを保証します。 |
WinAPIs\CS\Errors.cs WinAPIs\VB\Errors.vb |
構造体および共用体のマーシャリング方法
型 |
説明 |
サンプル |
---|---|---|
構造体 ByVal |
構造体を In パラメータとして渡します。 |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
構造体 ByRef |
構造体を In/Out パラメータとして渡します。 |
WinAPIs\CS\OSInfo.cs WinAPIs\VB\OSInfo.vb |
クラス ByVal |
整数メンバだけのクラスを In/Out パラメータとして渡します。 |
WinAPIs\CS\SysTime.cs WinAPIs\VB\SysTime.vb |
入れ子になった構造体を含む構造体 (平坦化) |
入れ子になった構造体を含む構造体を表すクラスをアンマネージ側に生成します。構造体は、マネージ側では 1 つの大きな構造体に平坦化されます。 |
WinAPIs\CS\FindFile.cs WinAPIs\VB\FindFile.vb |
入れ子になった構造体を含む構造体 (非平坦化) |
埋め込み構造体を含む構造体を渡します。 |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
別の構造体を指すポインタを含む構造体 |
別の構造体へのポインタをメンバとして含む構造体を渡します。 |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
整数 ByVal だけを含む構造体の配列 |
整数だけを含む構造体の配列を In/Out パラメータとして渡します。 |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
整数および文字列の ByRef を含む構造体の配列 |
整数と文字列を含む構造体の配列を Out パラメータとして渡します。Callee は、配列にメモリを割り当てます。 |
Custom\CS\OutArrayOfStructs.cs Custom\VB\OutArrayOfStructs.vb |
値型を含む共用体 |
値型 (整数と倍精度浮動小数点数) を含む共用体を渡します。 |
Custom\CS\Unions.cs Custom\VB\Unions.vb |
型が混在する共用体 |
型が混在している (整数と文字列) 共用体を渡します。 |
Custom\CS\Unions.cs Custom\VB\Unions.vb |
配列のマーシャリング方法
配列 |
説明 |
サンプル |
---|---|---|
整数 ByVal の配列 |
整数の配列を In/Out パラメータとして渡します。 |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
整数 ByRef の配列 |
整数の配列を In/Out パラメータとして渡します。配列のサイズは変更可能です。 |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
整数 ByVal の 2 次元配列 |
整数の行列を In/Out パラメータとして渡します。 |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
その他
項目の型 |
説明 |
サンプル |
---|---|---|
HandleRef |
ガベージ コレクションが実行されないようにするため HandleRef を使用する必要があるケースを示します。 |
WinAPIs\CS\HandleRef.cs WinAPIs\VB\HandleRef.vb |
関数ポインタ |
関数ポインタを要求するアンマネージ関数にデリゲートを渡します。 |
Custom\CS\Callback.cs Custom\VB\Callback.vb |
void* |
パラメータとして void* を持つ関数を呼び出します。 |
Custom\CS\Void.cs Custom\VB\Void.vb |
LPARAM |
GCHandle ハンドルを使用して、マネージ オブジェクトを LPARAM を要求するアンマネージ関数に渡します。 |
WinAPIs\CS\GCHandle.cs WinAPIs\VB\GCHandle.vb |
シングルスレッド アパートメント (STA)/マルチスレッド アパートメント (MTA) |
アンマネージ関数が CoInitialize を呼び出すときに、既定のアパートメント設定を変更します。 |
WinAPIs\CS\ActiveDir.cs WinAPIs\VB\ActiveDir.vb |
プラットフォーム呼び出しの詳細については、ソース コード ファイルのコメントを参照してください。