エラーでdllの読み込みエラーが出てしまったときの対処法を紹介します。
DLL ‘XXX.dll’ を読み込めません: 指定されたモジュールが見つかりません。(HRESULT からの例外: 0x8007007E)
というエラーメッセージが出たときの対処法。
これは開発者向けの内容になります。ソフトを使用していてエラーに遭遇した場合は開発者に問い合わせましょう。
一般的にはエラーの内容通りdllが読み込めていないだけなので、起動ファイルと同じディレクトリにプログラムで参照しているdllを配置するだけで解決します。
しかし「特定の環境」では適切な位置にdllファイルを置いているのにも関わらず読み込みエラーが出てしまいます。いくつか原因があると思うのですが、その内私が経験して解決したことのあるものを3つ紹介します。
- dllが32bitまたは64bitでソフトと互換性を持っていない
- dllまたはソフトがDebug版
- dllが依存するライブラリを持っていない
の3つです。
1番目の可能性は低いと思います。32bitのdllは32bitのソフトでしか使えず、64bitでも同じく合わせる必要があります。これは開発段階で気づくはずなので割愛します。
2番目の可能性はあります。配布前は普通に起動できていたのに、受け取った人の環境では起動できないというときにはビルドがReleaseになっているか確認しましょう。
3番目が今回の本題です。特定の環境でなぜかdllを読み込めないのは「dllが参照している別のdllを持っていない」可能性があります。
こうなるとdllの配置などを見直しても一向に解決しません。エラーメッセージにもそのように書いてくれれば分かりやすいのですが・・・。
解決するには「読み込めなかったdllが参照している別のdllを読み込めるようにする」必要があります。つまりはエラーが出たdllファイルの依存関係を調べれば良いのです。
dllライブラリの依存関係を調べる方法
Visual Studio用コマンドプロンプトを使って調べます。
dumpbin.exe /DEPENDENTS exeやdllファイル
と入力してエンターを押してください。
「dumpbin.exe /DEPENDENTS 」と入力してからdllファイルをコマンドプロンプトにドロップすると楽です。
これでdllが依存しているライブラリが表示されます。表示されたライブラリは全て必要なのでエラーが出る環境でこれらのファイルが読み込める状態なのかを確認しましょう!
これでたぶん解決すると思います。
素晴らしい情報です!
DLL関連は便利な反面エラーが起こるとなにかと厄介ですよね。
しかも大体は預かり知らない他人の環境でエラーが起こったりしますし…w
活用させて頂きます!