• ベストアンサー

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

fatal_errorの回答

回答No.3

横槍気味の解説ですが... ダイナミックリンクがよくわからなくなるのは 「関数のポインタ」のせいではないでしょうか。 変数に実体をポインタがあって、 (ポインタに格納されている)アドレスからもアクセスできるのだから、 関数にだって実体とポインタがあって、 そのアドレスから実行できる、ということです。 配列名が配列の先頭アドレスになるように、 関数名が関数の先頭アドレスになるのです。 その関数のアドレスを返すのがGetProcAddress関数で、 関数名の文字列を渡すとその関数のアドレスが返ってきます。 このとき「どのDLLを読みに行くか」を指定するのがLoadLibrary関数で、 この関数の戻り値を指定してDLLを選択します。 >パスをハードコーディングしていれば 要するにソース中に"C:\\exsample\\exsample.DLL"みたいに 直接書いてあったらそこを探しに行くということでしょう(たぶん)。 以上、同じくDLLの扱いに苦しんだ者の独り言でした。

noname#1176
質問者

補足

ダイナミックな方法の話ですね。 関数のポインタですね。 intへのポインタ(int*)や 構造体へのポインタがあるように、関数へのポインタがあるわけですね。 intへのポインタapがint型の変数aをさしていれば、*apは aのことですね。 同じように、関数へのポインタがあってそれが関数をさしていれば、関数を直接書くような感じで使えるわけですね。 問題は、それでは、関数のアドレスをどうやって取得するか(言葉を替えると、関数へのポインタが関数をさすようにするにはどうすればよいか)、というところにあるわけですね。 >その関数のアドレスを返すのがGetProcAddress関数で、 関数名の文字列を渡すとその関数のアドレスが返ってきます。 あ、なるほど、わかりました。 ソース中に書いてあるのは、関数名という「文字列」なんですね。 >>パスをハードコーディングしていれば >要するにソース中に"C:\\exsample\\exsample.DLL"みたいに >直接書いてあったらそこを探しに行くということでしょう(たぶん)。 以上のことと回答#2を総合すると、ダイナミックな方法の場合には、 「関数名を文字列としてソースコード中に記述し、さらに、その関数があるdllの名前もソースコード中に記述しなければならない。 そのときに、ソースコード中にパスを指定する場合と指定しない場合がある。 ソースコード中にパスを指定した場合は、そのパスにそのdllがなければ、エラーになる。 パスを指定していない場合は、LoadLibrary関数がdllを探しに行く。 (探しに行くディレクトリの順番は、回答#2の参照URLを参照のこと。)」 という具合になっているわけですね。

関連する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のままだと使えないようなので・・・