LoadLibrary

https://msdn.microsoft.com/ja-jp/library/cc428944.aspx https://msdn.microsoft.com/ja-jp/library/ms648042.aspx https://msdn.microsoft.com/ja-jp/library/ms648046.aspx https://msdn.microsoft.com/ja-jp/library/cc429803.aspx https://msdn.microsoft.com/ja-jp/library/cc429838.aspx https://msdn.microsoft.com/ja-jp/library/ms648042.aspx https://msdn.microsoft.com/ja-jp/library/cc429803.aspx https://msdn.microsoft.com/ja-jp/library/cc429838.aspx https://msdn.microsoft.com/ja-jp/library/ms648046.aspx

指定された実行可能モジュールを、呼び出し側プロセスのアドレス空間内にマップします。

追加のロードオプションを指定するには、LoadLibraryEx 関数を使います。

HMODULE LoadLibrary(
  LPCTSTR lpFileName   // モジュールのファイル名
);

パラメータ

lpFileName
[入力]実行可能モジュール(.DLL または .EXE ファイル)の名前を保持する null で終わる文字列へのポインタを指定します。ここで指定する名前は、モジュールのファイル名であり、モジュール定義(.DEF)ファイルの LIBRARY キーワードで指定されたような、ライブラリモジュールそのものに格納されている名前に関連付けられることはありません。

文字列にパスを記述した場合、指定されたディレクトリにファイルが見つからないと、関数は失敗します。パスを指定する場合は、スラッシュ(/)ではなく円記号(\)で区切ってください。

文字列にパスを記述しなかった場合、LoadLibrary は標準的な検索順序に従ってファイルを検索します。詳細については、「解説」を参照してください。

戻り値

関数が成功すると、モジュールのハンドルが返ります。

関数が失敗すると、NULL が返ります。拡張エラー情報を取得するには、 関数を使います。

Windows 95:LoadLibrary を使用して、数値識別子が 0x7FFF より大きいリソースを保持するモジュールをロードすると、LoadLibrary は失敗します。32 ビットコードから 16 ビット DLL を直接呼び出そうとした場合も、LoadLibrary は失敗します。サブシステムのバージョンが 4.0 を上回る DLL をロードしようとした場合も、同じく LoadLibrary は失敗します。DllMain 関数が Win32 関数の Unicode 版を呼び出そうとした場合も、LoadLibrary は失敗します。

解説

LoadLibrary 関数を使ってダイナミックリンクライブラリ(DLL)モジュールをマップし、返されたハンドルを GetProcAddress 関数に渡すと、その DLL 関数のアドレスを取得できます。LoadLibrary 関数は、DLL 以外の実行可能モジュールをマップする目的でも利用できます。たとえば、.EXE ファイルをマップして、返されたハンドルを 関数や 関数に渡すことができます。しかし、.EXE ファイルを実行するには、LoadLibrary ではなく、CreateProcess 関数を使ってください。

モジュールが、呼び出し側プロセス用にまだマップされていない場合は、システムは DLL_PROCESS_ATTACH 値をセットして、その DLL の DllMain 関数を呼び出します。その DLL のエントリポイント関数が TRUE を返さなかった場合、LoadLibrary は失敗し、NULL が返ります。( そして、システムは DLL_PROCESS_DETACH をセットして、プログラマが作成したエントリポイント関数を即座に呼び出し、その DLL をアンロードします。)

DllMain から FreeLibrary を呼び出すのは安全ではありません。詳細については、DllMain の「解説」を参照してください。

モジュールのハンドルは、グローバルでも継承可能でもありません。あるプロセスで LoadLibrary 関数を呼び出してモジュールのハンドルを取得した後、そのハンドルは他のプロセスで利用できません(GetProcAddress の呼び出しなど)。他のプロセスは GetProcAddress を呼び出す前に、そのプロセス内で LoadLibrary を呼び出さなければなりません。

lpFileName パラメータでファイル名の拡張子を省略した場合、既定の拡張子として「.DLL」が追加されます。文字列の最後に「.」を記述すると、拡張子なしのモジュール名になります。拡張子を省略した場合、この関数は、ロード済みモジュールのファイル名本体と、ロードしたいモジュールのファイル名本体だけを比較します。ファイル名本体どうしが一致した場合、ロードに成功します。それ以外の場合、この関数は次の順序でファイルを検索します。

1.アプリケーションのロード元ディレクトリ

2.カレントディレクトリ

3.Windows 95/98:Windows のシステムディレクトリ。このディレクトリのパスを取得するには、 関数を使います。

Windows NT/2000:Windows の 32 ビット版システムディレクトリ。このディレクトリのパスを取得するには、GetSystemDirectory 関数を使います。このディレクトリの名前は、SYSTEM32 です。

4.Windows NT/2000:Windows の 16 ビット版システムディレクトリ。このディレクトリのパスを取得する Win32 関数はありませんが、このパスも自動的に検索の対象となります。このディレクトリの名前は、SYSTEM です。

5.Windows ディレクトリ。このディレクトリのパスを取得するには、 関数を使います。

6.環境変数 PATH に記述されている各ディレクトリ

最初に検索されるディレクトリは、呼び出し側プロセスを作成したイメージファイルが格納されているディレクトリです( 詳細については、CreateProcess 関数を参照)。この仕様により、あるプロセスのインストール先ディレクトリを環境変数 PATH に追加することなく、特定のプロセス専用のダイナミックリンクライブラリ(DLL)ファイルを見つけることができます。

Windows 2000:パスが指定され、あるアプリケーション用のリダイレクトファイルが存在する場合、この関数はアプリケーションのディレクトリ内でモジュールを検索します。モジュールがアプリケーションのディレクトリ内に存在する場合、LoadLibrary 関数は指定されたパスを無視し、アプリケーションのディレクトリからモジュールをロードします。アプリケーションのディレクトリ内にモジュールが存在しない場合、LoadLibrary は指定されたディレクトリからモジュールをロードします。

Visual C++ コンパイラは、プログラマがスレッドローカル変数を宣言するための構文、_declspec(thread) をサポートしています。ある DLL 内でこの構文を使った場合、LoadLibrary または LoadLibraryEx を使ってその DLL を明示的にロードすることはできません。開発した DLL を明示的にロードしたい場合、_declspec(thread) の代わりに、スレッドローカル記憶域関数を使わなければなりません。

対応情報

Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダーファイル:Winbase.h 内で宣言、Windows.h をインクルード
インポートライブラリ:Kernel32.lib を使用
Unicode:Windows NT/2000 は Unicode 版と ANSI 版を実装

参照

DllMain, , FreeLibrary, GetProcAddress, , , LoadLibraryEx,

表示: