debug
Win32API
dll
LoadLibrary

LoadLibraryで126エラーが出たとき、原因となっているファイル名を知る方法

More than 1 year has passed since last update.

Error 126 (ERROR_MOD_NOT_FOUND:指定されたモジュールが見つかりません。)

LoadlibraryでDLLをダイナミックにロードする時のロード失敗です。失敗したファイル名は教えてくれません。ロードしたいDLLそのものがロードできないのなら話は簡単ですが、ターゲットDLLが別のDLLをロードしようとして失敗した場合、解決に手間取ることがしばしばあります。

方法

LoadLibraryを使わずLibファイルをリンクしてDLLをロードするコンソールアプリケーションを作ります(暗黙的リンク)。実行するとWindowsはアプリケーション開始時にDLLロードに失敗し、失敗の原因となったDLLを表示します。DLLからDLLを呼んでいる場合も含めて失敗したファイル名を教えてくれます。

※この方法は、ロードするDLLのLIBファイルがあって暗黙的リンクできる場合だけしか使えません。

実施例

下の例はエラーを起こすDLL内の関数"registerDLL"を呼びだしています。

ConsoleApplication1.cpp
#include "stdafx.h"

void __stdcall registerDLL();

int _tmain(int argc, _TCHAR* argv[])
{
    registerDLL();
    return 0;
}

リンクするLibファイルの名前とディレクトリをリンカに設定して、暗黙リンクとします。

実行するとファイル名の書かれたエラーポップアップが表示されます。
err.png
あれれ、これデバッグモードやんか!