新生活!引っ越してから困らないように注意すべきことは?>>

windowsAPIの関数の呼び出しのソースコードがコンパイラによって

マシン語に変換されるときに、

コンパイラはwindowsAPI(DLL?)が保管されているパス(DLLのバイナリの先頭のポインタアドレス?)をどのようにして知るのでしょうか?

共通のルールがあるのですか?

ソースコード上で呼び出す書き方は理解しています。

質問者からの補足コメント

  • tacosan さん

    コンパイラ"が" 知らないならば、何がその情報を保存しているのかが知りたいです。

    私は以前はデバイスドライバーではないかと申し上げたのですが。

    先日の「CPUが変わったらコンパイラも変わらなければならなくなる」
    という質問の件は、私が大きく勘違いしていました。
    私は処理系の異なるCPUを付け替えることを想定していましたが、処理系が異なるCPUをWindowsに付け替えることは、そもそもないのでそのような事は想定する必要はありませんでした。

      補足日時:2020/11/09 01:57
  • cametan_42 さん

    丁寧な回答ありがとうございます。

    「標準コンパイラ」という言葉は「標準ライブラリ」を誤字った部分もあるのですが、
    それによって他の情報を伺えたので良かったと思っています。

    それでも過去の質問履歴を含めて表記のブレによるデタラメさはあると思います、
    それはひとえに私の無知によるものだと思います。

    また、あまり具体的に名称を絞らないことで広範な範囲で回答を頂けるようにしたいという意図もありました。

    リンカについてはコンパイラの記事を読む際に必ず出てくる言葉でしたが、ご指摘いただくまでその関連性を無念ながら理解することはできていませんでした。

    No.2の回答に寄せられた補足コメントです。 補足日時:2020/11/09 13:18
  • 「コンパイラ」というものをインストールしてくる場合リンカも一緒に付いてくるので、私の中では広義のコンパイラとはリンカも含まれているものとして考えていました。

    リンカが静的にライブラリを、動的にDLLを結合する場合であれ、それらのライブラリの呼び出しのためには「名前解決」のようなことをしなければならないと思います。

    microsoftのサイトに「この関数名がソースコード上にあれば、リンカがマシン語ではwindowsOSのこの位置にあるこのライブラリを取ってくるか、または実行時にOSが検索して動的に呼び出せるようにマーキングするようにリンカを作成してください」という仕様が公開されているなら理解できるのですが、
    サイトを見る限りプログラマが呼び出す側の「ソースコードの書き方」しか載っていないように思うのですが。

    続けての質問ですが、もしお気になさらないようであれば回答いただけると幸いです。

      補足日時:2020/11/09 13:19
  • 過去の質問でいただいたリンクや最近知ったキーワードによって検索すべき事柄が絞り込めるようになったと感じますので一旦調べてみようと思います。

    皆さまありがとうございました。

      補足日時:2020/11/09 15:40
gooドクター

A 回答 (3件)

うーんとね。



他の質問も見たんですが・・・色々疑問を持つのは悪い事じゃないんだけど、用語が結構デタラメなんですよ。正直言うと。
例えば、「C標準コンパイラ」って言った時、何を想定しています?
プログラマが「標準」って聞いた時に、通常思い浮かべるのは「言語仕様」の事です。そしてC言語仕様は全然dllの存在は想定していない。それはWindowsの特徴であって、C言語自体には「全く関係がない」のです。
んで、現時点、ワールドワイドではCの「標準」言語仕様は2017年に制定(と言うか修正が入った)通称C17と呼ばれるモノです。日本国内だといまだ2000年年に制定されたC99ですね。

JIS X 3010:2003
https://kikakurui.com/x3/X3010-2003-01.html

そうするとですね。そもそも、多分想定してるのはMicrosoft Visual C++に「付属品として」くっついて来てるC言語処理系だと思うんですが、こいつは現在のC言語の標準には従っていません。MicrosoftはC++が主力だと考えてる模様で、Cのアップデートには全然積極的ではないのです(逆に、C++は2017年に制定されたC++17にほぼ準拠してるか、あるいは実装が終了した筈、です)。
いずれにせよ、恐らく貴方が考えている「標準」と、プログラマが認識してる「標準」は全然意味が違います。

それと、どんなライブラリ(dllを含む)を使用しようとも、貴方が書いてるプログラムとの「連動」を司るのは、コンパイラの仕事じゃないです。それを行うのはリンカ(Linker)、と呼ばれる別のプログラムですね。

リンカ:
http://e-words.jp/w/%E3%83%AA%E3%83%B3%E3%82%AB. …

上のページの「動的リンク」の項目も参照の事。dllはdynamic link library(動的リンクライブラリ)の事ですからね。
動的リンクの場合、リンカは、原則的にコンパイラに、実行ファイルが必要とするdllの存在をマーキングするだけ、です(Linuxだとsoファイル、ってのがWindowsのdllに当たりますが)。で、大体こういう場合、あとはケツを拭いてくれるのはOSの役目になります。だから所定の場所にdllが無いと、プログラムを実行した時に「xx.dllが存在しません!」とか文句を言われるわけですよ。
この回答への補足あり
    • good
    • 1
この回答へのお礼

ありがとうございます。

補足にて追記しましたが、もしお時間ありましたらご覧いただけますようによろしくお願いいたします。

お礼日時:2020/11/09 13:26

DLL の関数を呼び出すには


①LoadLibrary 関数で DLL をプロセスのメモリへロードする。
②GetProcAddress 関数で関数のエントリポイントを得る。
③関数を呼び出す。

DLLの処理を静的ライブラリ経由で呼ぶ場合、
①②③をする静的ライブラリが別途必要。
これを「インポートライブラリ」といいます。
#①②③を明示的にコーディングしても動きます(^^;

Windows API用のものは予めだいたい用意されてます。
あなたのプログラムはそれをリンクしているはずです。

コンパイラにとって、「インポートライブラリ」は
普通の静的ライブラリです。
    • good
    • 1
この回答へのお礼

ありがとうございます。

補足との入れ違いになりましたが、回答いただいたようなことが知りたかったです、少し時間を取って考えてみます。

お礼日時:2020/11/09 13:24

「コンパイラは」知らない.

    • good
    • 1
この回答へのお礼

はい、どのようにDLLを呼び出せるマシン語になるのでしょうか。

お礼日時:2020/11/09 00:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング