※ ChatGPTを利用し、要約された質問です(原文:DLL参照時に指定されたモジュールが見つかりません。(HRESULT からの例外 0x8007007E) が発生してしまう。)
DLL参照時に指定されたモジュールが見つかりません。
このQ&Aのポイント
C++プロジェクト(Windowsフォームアプリ)でのDLL参照は成功したが、クラスライブラリプロジェクトと連携させるとエラーが発生。
開発環境はMicrosoft Visual Studio 2008。問題が発生しているDLLはUSBIODLLDemo.dll。
解決策がわからず、エラーの原因と解決方法についてアドバイスを求めている。
DLL参照時に指定されたモジュールが見つかりません。(HRESULT からの例外 0x8007007E) が発生してしまう。
C++プロジェクト(Windowsフォームアプリ)を作成し、あるサイトで公開されているDLLを実装し→コンパイル→デバッグ実行させた所、問題なく動作が確認できたのですが、
クラスライブラリで作成したC++新規プロジェクトに同じくDLLを実装し、同一ソリューション内にC#又はC++でWindowsフォームアプリを作成し、先に作成したクラスライブラリプロジェクトを参照させる形態で作成した際に、コンパイル→デバッグ実行させた所、コンパイルは通ったのですがデバッグ実行時に、DLLを参照しようとしたタイミングで
「DLL参照時に指定されたモジュールが見つかりません。(HRESULT からの例外 0x8007007E) が発生してしまう。」
というエラーが発生してしまいました。
何故Windowsフォームアプリ単体時にはDLLが参照できたのに、クラスライブラリにし複数プロジェクトにして実行するとエラーが発生してしまうのか、どなたか原因、解法等 心得ておられましたら御指南のほど宜しくお願いします。
以下 事象詳細です。
開発環境:Microsoft Visual Studio 2008
公開DLL:USB-IOを制御する目的のUSBIODLLDemo.dllというDLLです。
<成功時>
1.C++プロジェクト(Windowsフォームアプリ)新規作成
2.DLLがインストールされているフォルダから.dllファイル, .hファイル、.libファイルをコピーしプロジェクト新規作成したフォルダにコピーする
3.プロジェクトのプロパティ→構成プロパティ→リンカ→入力→追加の依存ファイル に.libファイル名を記入
4.ダウンロードの.hファイルから
__declspec(dllimport) BYTE __stdcall GetNo(void);
__declspec(dllimport) void __stdcall P1Write(BYTE newVal);
__declspec(dllimport) BYTE __stdcall P1WriteBit(BYTE Bit, BOOL Tf01);
__declspec(dllimport) BYTE __stdcall P1Read(void);
をコピーしstdafx.h へ貼付け。
5.stdafx.hへ貼り付けた宣言がこのままではコンパイルが通らなかったため
#define BYTE unsigned char
#define BOOL bool
を追記。
6.ダウンロードしたDLLの関数を使用した一文を実装
7.コンパイル→デバッグ実行→ 無事実行完了!
<エラー発生時> *下記事象ではC#Winフォームアプリを挙げていますがC++Winフォームアプリで試しても同じ結果になりました。
1.C++プロジェクト(クラスライブラリ)新規作成
2.DLLがインストールされているフォルダから.dllファイル, .hファイル、.libファイルをコピーしプロジェクト新規作成したフォルダにコピーする
3.プロジェクトのプロパティ→構成プロパティ→リンカ→入力→追加の依存ファイル に.libファイル名を記入
4.ダウンロードの.hファイルから
__declspec(dllimport) BYTE __stdcall GetNo(void);
__declspec(dllimport) void __stdcall P1Write(BYTE newVal);
__declspec(dllimport) BYTE __stdcall P1WriteBit(BYTE Bit, BOOL Tf01);
__declspec(dllimport) BYTE __stdcall P1Read(void);
をコピーしStdafx.h へ貼付け。
5.Stdafx.hへ貼り付けた宣言がこのままではコンパイルが通らなかったため
#define BYTE unsigned char
#define BOOL bool
を追記。
6.ダウンロードしたDLLの関数を使用した一文を実装(公開関数として)
7.C#プロジェクト(Windowsフォームアプリ)新規追加 *C++(Windowsフォームアプリ)でやっても同じ結果になりました。
8.新しい参照の追加で上のクラスライブラリプロジェクトを追加
9.フォームアプリ側でクラスライブラリプロジェクトの関数を実行する処理を実装
clsTest ctst;
ctst.Exec();
10.コンパイル→デバッグ実行→DLLを参照しようとしたタイミングでエラー発生!
「DLL参照時に指定されたモジュールが見つかりません。(HRESULT からの例外 0x8007007E) が発生してしまう。」
*クラスライブラリ側の、DLLの関数を呼んでいる部分をコメントアウトするとエラー無く実行できてしまいます。
お礼
丁寧な御指南ありがとうございました。 事象を詳細に説明して頂いた事で非常に参考になりました。 お陰様でC++Winフォームのケース、C#Winフォームのケース共に解決致しました。 <↓解決詳細です↓> ・C++winフォームの場合、USBIODLLDemo.dllをソリューションの階層のDebugフォルダに追加する事で解決致しました。 ・C#winフォームの場合、御指南頂きました通り USBIODLLDemo.dll をC#プロジェクトのbin\Debugに追加する事で解決致しました。