はじめまして。
dll参照の設定について、分かる方いましたらご教授願います。
あるライブラリを購入しサンプルプログラムを実行しようとしたところ
「xxx.dllが見つからなかったため、このアプリケーションを開始できませんでした。
アプリケーションをインストールし直すとこの問題は解決される場合があります。」
という、エラーメッセージが出て実行できません。
xxx.dllの存在場所は、分かっています。
プログラムと同じディレクトリにxxx.dllをコピーすれば動作するのですが
いくつもdllとサンプルプログラムがあるためdllのコピーなどにとても時間が
かかってしまいます。
どこかでdllのパスを設定することによりサンプルプログラム毎にdllのコピー作業が
なくなると助かるのですがそのような設定はないでしょうか?
環境は、WinXP SP2
VC++2003 MFC です。
[ツール]メニュー→[オプション]→[プロジェクト]→[VC++ディレクトリ]で、
対象となるdllが存在するディレクトリを設定しましたが現象は変わりませんでし
た。。。
よろしくお願いします。
>WinXP SP2
でテストのときにコピペが面倒ということなら
SetDllDirectory
を試してみてください。
参考
http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=1069128&SiteID=7
本番では、きちんとインストーラか何かでdllを実行ファイルと同じディレクトリ
に展開されるようにしておくべきでしょうけど。
(SetDllDirectory関数を使わないでも動くようにすべき。
→Xp SP1以降の縛りがあるため)
>SetDllDirectory
はLoadLibraryなどの後でロードするDLL用って事は無いですか?
出ているエラーメッセージは、Windowsがアプリケーションをロードするときに出す
ので、APIを実行する前にエラーになっていたら手が出せません。
OSの環境設定用APIというわけでも無いようですし…。
テストだけならDLL検索対象フォルダに放り込んでしまうのが一番手っ取り早いと
思います。
1.アプリケーションのロード元ディレクトリ
2.カレントディレクトリ
3.32 ビット版システムディレクトリ(system32)
4.Windows の 16 ビット版システムディレクトリ(system)
5.Windows ディレクトリ
6.環境変数 PATH に記述されているディレクトリ
のどこかです。
ライブラリの配布用APIのあるフォルダにパス通してしまってもいいと思います。
ライブラリのアンインストールなどの問題が出るので、リリースする際は実行ファイ
ルのディレクトリに入れるなど、他でそのライブラリを使う製品と競合しない措置が
必要です。
私の場合、開発環境では素直に環境変数のPATHにそのDLLがあるフォルダを
追加しています。この場合、開発中に途中のバージョンを一部別コピーで動かしたり
する事があるのでコピーする手間を減らす為にそうしています。
実際に配布する時はそのライブラリの性質を考えて配置場所を定める事になると
思いますので、ケース・バイ・ケースですね。
Blueさん、麩さんご回答ありがとうございます。
Blueさんに教えていただいたURLと麩さんからの助言をふまえ
DLLの存在するフォルダを環境変数のPATHに設定することで
問題を解決できました。
説明が足りませんでしたが、今回エラーの出るDLLは、
プログラムでLoadLiblaryするのではなく、ライブラリが
LoadLiblaryしていると思われるDLLです。
この場合、ステップ実行でも1行も実行できず、エラーが出て
しまいます。なのでSetDllDirectoryの使用はできませんでした。
説明不足で申し訳ありませんでした。
また何かありましたらよろしくお願いします。
PATIOさん、入れ違いになってしまいましたが
ご回答ありがとうございます。
配布について書いてなかったので追記します。
今回のソフトは、これまでのバージョンアップソフトになります。
今まで、実行ファイルのあるディレクトリにライブラリ、DLLを
配置していたので今回も同じような配置になる予定です。