• ベストアンサー

EXEを起動するとDLLが見つからないエラー

VC超初心者です。 あるベンダ提供のdllとヘッダファイル、libファイルすべてそろっています。 DLLを使用するにあたって、宣言を記述せずにlibファイルをインポートしました。 どうにかこうにかコーディングをしました。VisualC++でソースを開いて実行(F5)すると正常に動きました。 しかし、いざEXEファイルを作ってそれを実行すると「DLLが見つかりません」というエラーが出ます。 これはどうすれば回避できますか?

  • embe
  • お礼率94% (18/19)

質問者が選んだベストアンサー

  • ベストアンサー
  • kmb01
  • ベストアンサー率45% (63/138)
回答No.2

dllは基本的にexeと同じディレクトリかシステムディレクトリにあるのがいいと思います。dllを置いてよい場所はLoadLibraryのヘルプを参考にしてください。 VC上では実行できたというのはおそらくdllをプロジェクトのあるディレクトリに置いていたためカレントディレクトリで見つかったのではないかと思われます。

参考URL:
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdllpro/html/_win32_loadlibrary.asp
embe
質問者

お礼

>VC上では実行できたというのはおそらくdllをプロジェクトのあるディレクトリに置いていたため そのようです。ありがとうございました。

その他の回答 (1)

  • mappy1983
  • ベストアンサー率70% (7/10)
回答No.1

実行ファイル*.exeと同じフォルダにdllファイルのコピーを置いたらどうでしょう?

embe
質問者

お礼

おお!動きました。 こんな簡単なことなんですね。 ありがとうございます。

関連するQ&A

  • Dllの作成について

    以下はVC++を使いました。 Dllの関数を扱うプログラムをつくる際に、dllのヘッダとlibを使う場合と、dllのみ必要な時の二種類があります。 どちらも宣言部分のみを先にプログラムに読み込ませて実装部分をプログラム実行時にexeと結びつけるんですよね。 この時どちらもdllが必要なら、上の違いによるメリットやデメリットはなんでしょうか。

  • VC2005のDLLを6.0で呼び出すには

    VC 2005 Pro Editionで作ったライブラリ(ヘッダ、lib、dll)を頂きました。    頂いたDLLの形式は定義ファイル.defを使わない形式、declspec(dllexport)を使う形式の方です。  呼び出し側はVC6.0EnterPrize(SDK)を使います。 (諸事情により6.0以上にUPすることは不可能)     まず、静的リンクをし、関数を呼び出してみました。  (設定のリンクよりlibをリンクさせ、ヘッダをインクルードして)  すると以下のメッセージが出てしまいます。 リンク中... Dialog1.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) void __cdecl Init(unsigned char *,unsigned char *,unsigned char *,unsigned char *)" (__imp_?Init_Card@@YAXPAE000@Z)" は未解決です Debug/CardMake.exe : fatal error LNK1120: 外部参照 1 が未解決です 。 link.exe の実行エラー    色々やってみましたが、このエラーから回避できませんでした。  ヘッダ自体に #ifdef _USRDLL #define DLL_PORT __declspec(dllexport) #else #define DLL_PORT __declspec(dllimport) #endif    の宣言があるので、別に特別なことをしなくても、大丈夫そうなのですが、何故か出来ません。  次に動的リンクを行っていました。  するとLoadLibraryでエラーになり、GetLastErrrorで14001(エラーメッセージはつかめず)が返ってきました。 (色々調べたところ定義ファイルがないと動的リンクはできないようですね)    というわけでにっちもさっちも行かなくなった状況です。  そこでご質問です。 (1)定義ファイルを使わない形式のライブラリ(暗示的に定義されているもの)はどのように呼び出させばよいでしょうか? (2)2005のライブラリを6.0から呼び出すことは可能ですか?  また呼び出す方法は?  すいませんがご回答をお願いします。

  • DLLを直接プログラム内に取り込んでEXEファイルを作れますか

    VC++.NETで開発を行う予定ですが、 そのときicmp.dllというDLLを使う予定です。 これに関する説明を読むと、将来サポートされない可能性があるとのことでした。 それで、このDLLをスタティックライブラリをリンクするように、EXE本体のなかに取り込んでおきたいのですが、そのようなことは、出来るのでしょうか。 つまり、icmp.dllのある環境で、exeファイルを作り、 icmp.dllのない環境で、そのexeファイルを実行させたいのですが、そのようなことはできるのでしょうか。

  • DLLからEXEのクラスを呼び出すとリンクエラーになります。

    私は昔VC++6.0を少し触っただけの初心者に近い状態のレベルです。 作っているプログラムは、1つのソリューションの中にEXE実行するプロジェクトとDLLを作るプロジェクトの2つプロジェクトを含んでいます。 DLL側からEXEのクラスを使用すると、ビルド時にリンクエラーになります。LNK2019でシンボルのエラーなのですが、なぜそうなのか?がわかりません。 ご教授いただけますでしょうか。 <ソリューションの構成> A ソリューション  Aプロジェクト(.exe) AAクラス ERR親クラス ← ERR子クラスの継承 Bプロジェクト(.dll) 静的リンク(.defファイル使用) BAクラス BAクラスの実装 {  try {   throw ERR子クラス } catch(ERR子クラス) { } } やりたいことは、BプロジェクトにあるERR子クラスをBプロジェクトと Cプロジェクトの両方で使用したいです。 ビルド時に上のBAクラスのERR子クラスのところでコンパイルはとおるのですが、リンクエラーになります。エラーコードはLNK2019です。 何が足りないのでしょうか? dllからexeのクラスを呼び出すようなことはできないのでしょうか? このやり方自体に問題があり、他の方法にする方がいいですか? ERR親クラス、ERR子クラスともヘッダー定義があり。 CAクラスのヘッダー定義内でinclude宣言しています。 versionはVC2003++です。 よろしくお願いします。

  • DLLからサードパーティDLLを使うには

    現在VisualC++2010においてレギュラーDLLを作成しています。そのDLL内でサードパーティライブラリを使いたいのですが、MFCプロジェクトなどと同様にインポートライブラリ設定やDLLの配置を行なってもうまくいきません。具体的には、作成したレギュラーDLLをインポートしたプログラム実行時にdllinit.cpp内でDebug Assertionが出ます。 VC++においてDLL内からDLLを使用するのは一工夫いるということまではわかっているのですが、なにかよい解決策をご存知の方がおられましたらご教授願えれば幸いです。

  • BCBで作成したDLLを、VC++で静的リンクさせる方法

    BCBで作成したDLLを、VC++で静的リンクさせる方法 Borland C++ Builderで作成したDLLを、VC++アプリケーションで利用できるように LIBファイルに変換したいのですが、上手くいきません。 下記の手順を踏みました。 1. BCBでDLL作成   「VC++スタイルのDLL」で作成、   「VCLを使う」「CLXを使う」「マルチスレッドを使う」はチェックせず 2. コマンドラインで「IMPDEF.exe」を使用して、dllからdefファイル作成   (IMPDEF.exeは、\Borland\CBuilder6\Binに格納されていた) 3. コマンドラインで「LINK.exe」「LIB.exe」を使用して、defからlibファイル作成   (LINK.exeとLIB.exeは、\Microsoft Visual Studio\VC98\Binに格納されていた) 4. VC++プロジェクトファイルを保存したフォルダに、DLLファイルとlibファイルをコピー 5. VC++の「プロジェクト」-「設定」-「リンク」-「オブジェクト/ライブラリモジュール」に   作成したlibファイルを追加 VC++プロジェクトをビルドすると、下記のエラーメッセージが表示されます。 ///////////////////////////////////////////////////////////////////////////////// dllread.obj : error LNK2001: 外部シンボル "__imp__(関数名)@0" は未解決です LIBC.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です Release/dllread.exe : fatal error LNK1120: 外部参照 2 が未解決です。 link.exe の実行エラー ///////////////////////////////////////////////////////////////////////////////// BCBとVC++のバージョンは、下記の通りです。 BCB Professional 6.0 VC++ 6.0 ちなみに、同じDLLを動的リンクで利用することは出来ました。 初心者の質問で申し訳ございませんが、解決策が分かる方がいらっしゃいましたら 教えていただけないでしょうか?

  • DLLとインポート、エクスポート

    環境 Microsoft Visual C++ DLLはWin32 Dynamic-Link Library ExeはWin32 Application で作成しています。 DLLにメッセージボックスを表示するのみの処理の関数があり。 Exe側でその関数を使用したいだけです。 DLLのヘッダファイルにエクスポートしたい関数を _declspec(dllexport) void exportmain(); としています。 Exeではインポートを __declspec(dllimport) void exportmain(); としています。 プロジェクト⇒設定⇒リンクにlibファイルの設定もしています。 dll、libファイルの場所も問題ないと思います。 しかし、ビルドすると「外部シンボル~~未解決です」とエラーがでてしまいます。なにか原因がわかるかたおりましたら、ご教授お願い致します。

  • C++のdllの作り方を教えてください。

    こんにちは。 先週、「UNIXのC++で共通クラスを作りたい。」って言う質問をした orange_pieと申します。 そのバージョンアップ質問として、作成した共通クラスをDLLにして みんなに提供したいのですが、コンパイルはアーカイブを作る時と どう違うのでしょうか? ちなみに、コンパイルした後でarコマンドを使ってアーカイブを作っていました。 % gcc -c aaa.cpp % ar -r libaaa.a aaa.o dllを作るには、ヘッダーファイルの記述に何か特別なものが必要ですか? また、できあがったdllを使う側では、ヘッダーファイルをインクルードして LIBパスの通ったところにdllを入れておけば良いのでしょうか? どなたか教えてください。

  • EXE作成時のエラーで・・。

    いろいろ確認してみたのですが自分では判らなかったので、どなたか同じような経験をされた方がいればお教えください。 元々あったLibファイルに新たに処理を追加して作成しなおしました。 XXX.libファイルは正常に作成されました。 追加した処理によるヘッダファイルなどの新たな include処理はありませんでした。 次にlibファイルを使用しているEXEを再作成し様としたところリンク時に以下のエラーが出てEXEが作成できなくなっております。 d:\msvc\lib\LLIBCE.lib(dos\diffhlp.asm) : error L2025: __AHSHIFT : シンボルが 2 回以上定義されています。 VC++ Ver1.51を使用しております。 もしわかる方居られましたらアドバイス下さい。よろしくお願いします。

  • BCBでVC++のDLLを利用するために

    C++Builder5で、VC++で作ったDLLを利用する必要に駆られてしまいました。 提供されているのはDLL本体とヘッダの2点で、BCBからリンクするために、implibを使ってdllからlibの作成をし、プロジェクトに加え、ヘッダをインクルードしました。続けて試しにコードを書いたところ、 '外部シンボル_initialize_libraryが未解決' との表示。(initialize_libraryとはDLL内にある関数です。) 調べてみたところ、 1.呼び出し規約は標準で __stdcall 2.VC++ では、_ がシンボル名の頭に付く 3.Builder ではつかない これで食い違いが生じているんだと思うのですが、更に調べると、モジュール定義ファイルにて再定義をすれば良いとの結論になりました。 BorlandのFAQも見たのですが、書式が理解できなくて・・・そこで質問させて頂きたいのですが、単純にproject名.defを作って、 >IMPORTS >initialize_library=_initialize_library とやってプロジェクトに加えれば良いのでしょうか? ソース本体にextern "C" というのも必要なようですが、こちらの記述も教えて頂けたら嬉しいです。