• ベストアンサー

exeファイルはどのdllを参照すべきか、知っているのでしょうか。

BLACKTALONの回答

回答No.2

DLLの場合、俗にスタティックリンクという方法とダイナミックリンクというリンクの方法と2つあります。 (本当に俗なので正しい呼称は知りません) まず、スタティックリンクのときは通常通り、.hファイルと.LIBファイルが存在します。 で、普通にリンクできます。 ただし、ライブラリの実体はリンクされず、プログラムの実行時にDLLファイルからロードされる仕組みになっているようです。 このとき、ある順序でDLLを探して無い場合は実行できません。 エラーが出るはずです。 つまり、LIBファイルはどのDLLにどの関数があるかの記述があるのだろうと 思われます。 ダイナミックリンクの時はLoadLibrary()とGetProcAddress()Win32APIを使って関数のポインタを取得することで使用が可能になります。 この場合、.hも.LIBも要らないはずです。この場合はどのDLLにどの関数が入っているかを当然プログラマは熟知し、コード内に記述する必要があります。 DLLの場所に関してはLoadLibrary()の検索順序に当てはまるようにする必要がありますしパスをハードコーディングしていればそのディレクトリにDLLが無いと見つかりません。 なお、最近はDLLのバージョンの違いによる障害・トラブルの解決などいろんな技術によって若干この話が当てはまらないことがあるかも知れないです。 LoadLibraryの検索順序に関しては参考URLの解説をご覧ください。 1番の方はSystemディレクトリにDLLを置くと動作するのはPATHのためだと解説されていますが、Systemディレクトリに関してはPATHよりもLoadLibrary()の仕様であると解釈した方が良さそうです。 ただしPATHが通っているとDLLの関数を実行できることは間違いないです。 どちらにせよ、ライブラリをリンクしたり、ヘッダファイルをインクルードしたり、コード内にDLLファイル名を記述する必要があるわけですから、プログラマはその関数について有る程度知っている必要はありますよね。 参考URLのLoadLibrary()のヘルプにもLoadLibrary()自体がどのDLLに記述されていてどのLIBをリンクし、どのヘッダをインクルードすればよいかが最後に書いてあります(ただし、VC++はほとんど自動でやってくれますけどね)。

参考URL:
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_loadlibrary.htm
noname#1176
質問者

補足

>DLLの場合、俗にスタティックリンクという方法とダイナミックリンクというリンクの方法と2つあります。 すみません。「DLL=ダイナミックリンク。」だと思っていました。 (DLLは「ダイナミックリンクライブラリ」ですよね。) >スタティックリンクのときは通常通り、.hファイルと.LIBファイルが存在します。 で、普通にリンクできます。 >ただし、ライブラリの実体はリンクされず、プログラムの実行時にDLLファイルからロードされる仕組みになっているようです。 ↑これを「ダイナミックリンク」というのだと思っていました。 >このとき、ある順序でDLLを探して無い場合は実行できません。 >エラーが出るはずです。 「○○.dllが見つからない」というエラーですね。 >つまり、LIBファイルはどのDLLにどの関数があるかの記述があるのだろうと 思われます。 あ、そうか。リンカは、リンクを行うときに、.LIBファイルを見て、 「この関数の実体は○○.dllというdllにあるんだな」 ということを知るわけですね。 リンカは、exeの中に「この関数の実体は○○.dllというdllにある」ということを吹き込むわけですね。 だから、exeは、そのことを知っているわけですね。 >ダイナミックリンクの時は... すみません。私の頭がついていけません。 ゆっくり考えさせてください。 >どちらにせよ、ライブラリをリンクしたり、ヘッダファイルをインクルードしたり、コード内にDLLファイル名を記述する必要があるわけですから、 (ダイナミックリンクはちょっと理解できていないんですが...) スタティックリンクのときは .LIBにdll名が書かれているわけだから、 「コード内にDLLファイル名を記述する必要があるわけです」というのは、.LIBを作るときの話ですよね?

関連するQ&A

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

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

  • exeをdllの様に利用する方法

    以前、どこかのサイトで見たことなので記憶があいまいなのですが、exeファイルもdllの様にリンクして関数を呼び出せるというように記憶しています。 実際、可能なのでしょうか?だとすると具体的にどのように書けばよいのでしょうか。詳しく説明しているサイトやサンプルプログラムなど乗っているサイトがあれば教えてください。 環境はC/C++でVisual Studioです。 よろしくお願いします。

  • 「DLLファイル」とは?

    DLLファイルについて、よく分かりません。 たまにPHPなどでプログラムを組む時に、拡張ライブラリとして.dllファイルをextディレクトリに入れたりするのですが、本来DLLファイルはどのプログラミング言語からでも呼び出せるものなのでしょうか?(↓の説明を読むと、そんな気がしてしまうのですが)それとも、特定の言語のライブラリなどをdllと呼ぶようなイメージでよいのでしょうか?それとも、ぜんぜん別のものなのでしょうか? http://e-words.jp/w/DLL.html

  • EXEからDLLへ移植

    以前、下のような質問をさせていただいたものです。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1748227 EXE(実行形式)で既にあるプログラムをDLLとして移植したいのですが、うまくいきません。うまくいかない事象は上のページで質問しましてまだ解決しておりません。(ウインドウ内にCreateDialogを用いてダイアログを表示させようとしても表示されない) 実行形式で組まれたプログラム(ソース)をDLLに移植する時の一般的な方法、注意すべきところ、そのままソースを移植してもダメな理由(EXEとDLLの違い)などありましたら教えてください。同じようなことをした経験のある方など、よろしくお願い致します。

  • cygwin1.dll を必要としないCのexeファイルを作りたいです

    はじめまして、shigure2005と申します。 私は普段UNIX上でC言語のプログラムを書いているのですが、 わけあってWindows上で動くようにする必要が出てきました。 そのプログラムをそのままcygwinでコンパイルしたところ コンパイルでき、実行ファイルも問題なく実行できたのですが、 このままですとcygwin1.dllが必要になってしまいます。 ですので、これがなくてもすむような別のコンパイル方法を 教えていただければと思ったしだいです。 過去ログを探って、MinGWについては試してみたのですが、 コンパイルは問題なく通るのに、なぜか実行ファイルを 実行すると、うまく起動できません。Mingwは以下のファイルを ダウンロードしてインストールしました。 mingw-runtime-3.8.tar.gz mingw-utils-0.3.tar.gz MinGW-4.1.1.exe w32api-3.3.tar.gz binutils-2.15.91-20040904-1.tar.gz mingw32-make-3.80.0-3.exe PATHは「C:\mingw/bin;C:\cygwin/bin」の順に通していて、 コマンドプロンプトでコンパイルし、コンパイル後、 コンパイルに用いたdllがcygwin1.dllでないのを確認して います。また、helloworldなど簡単なプログラムなら、 Mingwでもうまくコンパイルできてます。cygwinとMingwで コンパイル性能に大きな差などがあるのでしょうか? また、cygwinだけでも、Mingw-runtimeをインストール すれば、cygwin1.dllを必要としない形式にコンパイル できるという話を聞いたのですが、ご存知の方が いらしたら教えてください。 どうぞよろしくお願いします。

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

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

  • 読み込むDLLのディレクトリを変更したい

    Visual C++ 7.1を使用しています。 ライブラリを使って作成したアプリを配布するとき、 一緒にDLLファイルも配布しないと起動できませんよね? 通常は、DLLファイルのパスは実行ファイルと同じか、 system32などのディレクトリに入れなければ 「~~~.dllが見つかりません。」 みたいなエラーが表示されるかと思います。 (違ったらすみません) そうではなく、DLLファイルが10個以上ありますので、 実行ファイルと同じディレクトリだとややこしくなるため、 実行フォルダより1つ下の階層にまとめて置きたいのですが、 そのような事は可能なのでしょうか? できれば、LoadLibraryなどの関数は使わず、 何かしらの設定で出来るのであればそれが望ましいです。 可能でしたら、方法をご伝授いただけると助かります。 よろしくおねがいします。 サンプルですが構成としては以下のような感じです。 (※[ ]はフォルダ名を表します) [Main]  ReadMe.txt  実行ファイル.exe  [Image]   image1.png   image2.png  [Sound]   sound1.wav   sound2.wav  [DLL]   graphics2d.dll   input.dll   sound.dll   file.dll

  • PHPでexeファイル実行

    C言語でMPG形式の画像ファイルを読み込み、画像処理をしてテキスト形式で画像データを出力するプログラムを作成したのですが、 これをPHPプログラム内で動作させ、テキストデータ(できればバイナリのほうがいい)を読み取りたいと思います。 これはexeファイルをexecやsystem関数で実行することで解決できるのでしょうか? また、C言語の画像処理プログラムが画像を読み込んでからテキストデータを作成するまで1分ほどのタイムラグがあります。 どうすればPHP内の処理でexeファイル実行→exeがデータベースから画像を読み込む→ 1分処理待ち→テキスト作成→作成されたテキストデータをPHPで読み込み とできるのでしょうか? ちなみに、exeファイルとphpで作成した画像データベースはサーバー機に置くつもりです。 テキストデータを介さなくても、C言語プログラムからphpに直接データを渡す方法があればそちらのほうが望ましいです。 連続投稿で申し訳ないのですが、急を要するのでぜひともご解答お願いします。

    • ベストアンサー
    • PHP
  • C++DLLの明示的リンクに関して

    DLLを明示的リンク(LoadLibraryとGetProcAddressを使用して)で使うとき、C言語では、関数名がそのまま利用できますが、C++では、オーバーロード機能があるため、関数名が変化してしまいます。C++でDLLを明示的リンクで使用するにはどうしたら良いのですか?

  • exeファイル

    最近C言語を始めたのですが 早くも行き詰ってしまいました コンパイラを使って exeファイルを作ったのですが どうすればネット上でそのプログラムを使えるのでしょうか? 拡張子がexeのままだと使えないようなので・・・