質問: 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の関数を呼んでいる部分をコメントアウトするとエラー無く実行できてしまいます。
回答: やるならば ソリューション名をつけて複数のプロジェクトをまとめたほうがいいように思います 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などで検索してみましょう