解決済みの質問
質問:No.5388315
すぐに回答ほしいです
お気に入り投稿に追加する (0人が追加しました)
回答数1
閲覧数5698
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の関数を呼んでいる部分をコメントアウトするとエラー無く実行できてしまいます。
投稿日時 - 2009-10-22 20:20:18
質問者が選んだベストアンサー
回答:No.1
やるならば ソリューション名をつけて複数のプロジェクトをまとめたほうがいいように思います

VC++/C#で新規にプロジェクト(ソリューション)を生成する際のダイアログの『ソリューションのディレクトリを作成』にチェックを入れて
『USBIODEMO』などといった具合にします
その中に.NET用のクラスライブラリのプロジェクトを作成します
こうすると
USBIODEMO\Debug(または Release)に出来上がったDLLが生成されます
同じように テスト用のFormアプリをVCのプロジェクトで作成します
コンパイル/リンクがうまくいけば 上記のフォルダに EXEが生成されます
この状態でFormEXEのデバッグを行ってやれば 質問のようなエラーは回避できると思います

C#の場合は 元の『USBIODLLDemo.dll』をC#のプロジェクトの『bin\debug(またはRelease)』にコピーしないといけないでしょう

つまりは クラスライブラリのDLLは見つかったが 元の『USBIODLLDemo.dll』が見つからなかった
という現象ではないかと思います

アプリの参照はクラスライブラリーまでなのでクラスライブのDLLまではコピーしたりする面倒を見てくれます
クラスライブラリが参照しているDLLまで面倒見てくれないためなのかもしれません

DLLの検索順についてWebなどで検索してみましょう
投稿日時 - 2009-10-23 04:51:07
この回答を支持する
(現在0人が支持しています)
お礼
丁寧な御指南ありがとうございました。
事象を詳細に説明して頂いた事で非常に参考になりました。
お陰様でC++Winフォームのケース、C#Winフォームのケース共に解決致しました。

<↓解決詳細です↓>
・C++winフォームの場合、USBIODLLDemo.dllをソリューションの階層のDebugフォルダに追加する事で解決致しました。
・C#winフォームの場合、御指南頂きました通り USBIODLLDemo.dll をC#プロジェクトのbin\Debugに追加する事で解決致しました。
投稿日時 - 2009-10-23 10:05:21
この質問は役に立ちましたか?
0人が「このQ&Aが役に立った」と投票しています
もっと聞いてみる
関連するQ&Aはこちら
un4seenのBASS audio libraryを用いてC#で動画再生のアプリを作成しようとしています。 BASS_DSHOWというライブラリを用いたいと思いまして、下記のサイトからダウンロードし...
写真を開こうとするとこのエラーコード:0x8007007eが出て、画像を開くことが出来ません。 故障か何かなのでしょうか。 解決方法があれば教えて下さい。 お願い致します。 ...
VisualC++でWindowsフォームアプリを作ったら やっぱり.NET Frameworkは必須なんでしょうか?? ...
この他の関連するQ&Aをキーワードで探す
プログラミングのサブカテゴリ
カテゴリ:C・C++
RSS
-PR-
PR
-PR-