• ベストアンサー

WINAPIとAPIENTRYの使い分け

表題の通りです。 WINAPIとAPIENTRYは__stdcallで定義されていることは知っていますが、 そもそも、この二つはどのような目的で使用されるものなのかが分かりません。 どのような目的があって、このようなものが定義されたのか、 そしてどのように使い分ければいいのかを知りたいです。

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

  • ベストアンサー
  • axsies
  • ベストアンサー率64% (38/59)
回答No.1

一つの理由としては、Windows SDKの関数の役割や意味づけを示しています。 WINAPIはWin32APIの関数である、ということを示しているだけです。 基本的に自分で書くコードの関数にWINAPIを付けるのは意味的にはよろしくないでしょうね。 別に害は無いと思いますが。 APIENTRYはWinMain関数とかDllMain関数の定義につけるものですね。 この二つの関数は、Win32APIの仕様として引数や返すべき戻り値は決まっているものの、ユーザーが定義しプログラムの最初に呼ばれる特殊な関数(エントリー関数)ですので別に定義しているだけだと思います。 (昔はリファレンスのサンプルでもWinMainの定義はWINAPIだったと思うんですけど) この他にも、例えばメッセージプロシージャなどのコールバック関数を定義するときはCALLBACKを付けますが、これも実体は__stdcallです。 もう一つの理由もあります。 もし各APIが__stdcallで直接宣言されていたとしましょう。 そして、Win32APIの仕様が変更になって呼び出し規約がstdcallから別のものに変更されたとします。(まずありえないと思いますが) この場合、数万行あるとも言われるwindows.h及び関連ヘッダの全ての関数宣言も書き換えるという大変更が生じます。 それだけではなく、windows.hはあらゆるWindowsアプリケーションがインクルードし依存していますから、これはマイクロソフトだけで収まる問題ではなく、世界規模での問題になることは必至です。 しかし、マクロ定義されていればWINAPIの一カ所を修正するだけで済みます。 少なくとも、ヘッダ丸々書き換えるよりは手間も影響も少ない、という事を見越しての事です。

500cii
質問者

お礼

なるほどAPIENTRYのENTRYってエントリポイントのことを言っていたんですね。 納得がいきました。ありがとうございます。

関連するQ&A

  • APIENTRY と WINAPI

    int APIENTRY WinMain( と int WINAPI WinMain( の違いは何ですか? 分かりやすい例があったら教えて下さい。 例えば、WNDCLASS と WNDCLASSEX なら WNDCLASSEX でないと hIconSm の定義がない というような感じで教えてほしいです。

  • [VisualStudio]コンソールではリンクOKなのに、WinAPIでリンクNG

    はじめまして。 今、VisualStudio2005でC++であるDLLをリンクして使用しようとしています。(もらったライブラリでブラックボックスです。⇒仮にsample.dll) sample.libをVisualStudioのプロパティでリンク設定して sample.libに含まれるinitialize()APIを呼びます。 initialize()の内部では (1)ファイル読み込み (2)読み込んだ情報から何かしらの処理 と流れるようです。 そこでコンソールで使用した場合には、きちんと動作するのですが Winアプリで作成して同じ処理をした場合には、処理が落ちます。 Winアプリで作成した場合の感触的には、 (1)までは動いて(2)で落ちます。 内部の処理が悪いのかもしれませんが、そもそも、コンソールとWinAPIで、リンク方法など異なる部分というのがありますでしょうか? 情報が少ないかもしれませんが、詳細とまでは言わず、一般論で構いません。 詳しい方がおりましたら、ご教授いただければと思います。 イメージ的には以下のとおりです。 コンソール: int main() { initialize(); return 0; } Win32: int APIENTRY _tWinMain(...) { initialize(); return 0; }

  • ExcelVBAでWinAPI関数を使用したいのですが

    WinAPI関数のライブラリーの一覧を見ることが出来ますか。またそれぞれの関数の意味、使用法などがわかる方法がありますか。

  • WinAPI GetDiskFreeSpaceEx について

    お世話になります。 既存のWinNTServerで動いていたPERLモジュールがあります。 その中にWinAPIのGetDiskFreeSpaceExを使用してドライブ空き容量を得ていたのですが、今回ServerがVersionUpし、WinServer2003になったところ、取得できなくなってしまいました。 確かにMSDNを見てもこの関数はMicrosoft Windows NT Server 4.0 Standard Editionまでとなっているように見えるのですが、ではWinServer2003ではどのようにしてドライブ空き容量を得ることができるのでしょうか? もしくは、記述方法を変えたらこの関数でも対応可能なのでしょうか? よろしくお願いいたします。

  • ――と……の使い分け。

    表題の通りですが、使い分けのルールがあれば教えて下さい。 ビジネス文書というよりは小説やエッセイにおけるルールあるいはニュアンスの違いが知りたいです。

  • 料、代、費の使い分けについて

    料、代、費の使い分けについて 表題どおり、料・代・費はどう使い分けますか。いつも間違えて使っていますが、何かルールでもないんでしょうか。教えてもらえると嬉しいです。

  • C言語の関数(if文やfor文を含む関数)の定義の仕方

    C言語の関数(if文やfor文を含む関数)の定義の仕方 int WINAPI WinMain(HINSTANCE hI,HINSTANCE hP,LPSTR lpC,int nC){ ●● } ↑上記のような形式のウィンドウアプリケーションの場合、 関数の定義はint WINAPI~の前にしておくべきなのでしょうか? 関数の中にif文やfor文を入れようとすると「関数定義のようですが、パラメータ リストがありません。外見上の本体をスキップします。」というエラーが出てしまいます。 int WINAPIの中で定義しようとするとそれはそれで「ローカル関数の定義が正しくありません」というエラーが出てしまいます。 詳しい方がいたらアドバイス願います。 ※関数を使わずにプログラムを組んだことはあるのですが、関数の定義に初挑戦しようとしたところ見事にわけが分からなくなってしまいました。

  • 福祉行政とは?

    表題の通りです。 福祉行政の明確な定義とは何でしょうか? 色々と調べてはみたのですが、はっきりと した答えは見つかりませんでした。

  • 卵の「卵白」や「卵黄」は液体ですか?

    表題のとおりですが、卵の「卵白」や「卵黄」は液体という定義でいいんでしょうか? 水や油は液体だと思いますが、卵白や卵黄も液体という定義でいいのかなと思いまして・・・

  • szとlpszの違い

    ハンガリー記法において、 文字列を表すプレフィクスにはszとlpszがありますよね。 WinAPIの関数定義を見るとこの二つを使い分けているように見えるのですが、 どのように使い分けるべきなのか教えてください。

専門家に質問してみよう