どのように私はWinMain関数を使用せずにWindowsアプリケーションを作成することができますか?

StackOverflow https://stackoverflow.com/questions/564576

  •  05-09-2019
  •  | 
  •  

質問

C / Cで書かれた

は、Windows GUIアプリケーションは、(むしろ 'メイン' より)エントリポイントとして 'のWinMain' を有する++。この私の理解では、コンパイラは、Cランタイムによって呼び出される「メイン」関数を作成することです。この「メイン」機能GUIに必要な環境を設定し、「WinMain関数」を呼び出し(インスタンスを指定することなどを扱う。)。

要するに、私は次のように異なるために、コンソールおよびGUIアプリケーションの起動を信じています:

コンソールアプリケーション: Cランタイム - > 'メイン' 関数(ハンドコード)

GUIアプリケーション: Cランタイム - > 'メイン' 関数(コンパイラ生成) - > 'のWinMain' 関数(ハンドコード)

私は(すなわち、「WinMain関数」を記述することなく)両方のこのような理解を検証し、私は「メイン」機能を備えたWindowsのGUIコードを渡すことができる方法を見つけるしたいと思います。

役に立ちましたか?

解決

あなたは間違って理解しています。メインとWinMain関数との差は、離れていくつかのdifferet初期化コードから、それに渡されるパラメータである。

メインは、次のようになります:

int main(int argc, char* argv[]);

WinMain関数は次のように見えますが。

int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
);

何かがセットアップにそれらのパラメータを持っており、電話をかける、それはスタートアップコードです。あなたがプログラムをコンパイルしてリンクすると、リンカのパラメータの一つは、エントリポイントであり、それは、コンソールまたはGUIアプリに応じて、起動コードの異なるビットになります。

あなたは確かに、それはcrt0.cと呼ばれていますちょうどあなたのVisual C ++ソースディレクトリに移動し、スタートアップコードを見つけることができ、独自のスタートアップコードを書くことができ、それはVC \のCRT \ srcディレクトリにあります。

他のヒント

ただ、メインを使用すると、WinMain関数をコーディングすることはできません。正当化するために、次の文をから採取しました   http://blogs.msdn.com/oldnewthing/archive/ 12分の2007/03 / 6644060.aspxする

  

[Windowsのプログラミングでは、]なぜアプリケーションのエントリポイントが呼ばれました   メイン?まあ、一つには、名前のメインは、すでに採取し、   Windowsは別の定義を予約する権限を持っていませんでした。   何のC言語の標準化委員会は当時ありませんでした。 Cました   何デニスはそれがあったと述べ、それはほとんどが保証しなかったデニス   Windowsのソースコードを保存するために特別な手順を取ります   C言語の任意の将来のバージョンで互換性。 K&R以来   実装が許容される形態を拡張することができることを指定していませんでした   主な機能のために、それは法的あったことは完全に可能でした   誤っメイン宣言したプログラムを拒否したCコンパイラ。ザ・   現在のC言語の標準は、明示的に実装固有の許可します   代替メインの定義が、支持体にすべてのコンパイラを必要とします   この新しいWindows固有のバージョンのWindowsプログラムをコンパイルするために、   無償あなたが使用できるコンパイラのセットを制限でしょう   Windowsプログラムを書きます。

     あなたがその障害を克服するために管理している場合、

、あなたはその問題を持っていると思います   

:メインのWindowsのバージョンは、このようなものでなければならないであろう
int main(int argc, char *argv[], HINSTANCE hinst,
         HINSTANCE hinstPrev, int nCmdShow);
     

によりC結合が行われたように、関数のすべてのバリエーションは、に同意しなければなりませんでした   パラメータは、彼らが共通して持っていました。これは、Windows版のことを意味し   既存の最長の終わりにそのパラメータを追加する必要があります   メインのバージョン、そしてあなたがあなたの指と希望を横断する必要があると思います   ことは、C言語では、メインの別の代替バージョンを追加したことはありません。もし   それは変わるので、あなたは、あなたの交差指があなたを失敗し、このルートを行ってきました   三番目のパラメータは、いくつかの時間後にメインに追加されたことを出して、それ   お使いのWindows用バージョンと競合。

     

あなたがそれを許可しないデニスを説得するために管理したと   メインの3パラメータバージョン。あなたはまだそれらを思い付くする必要があります   すべてのプログラムの起動コードすることを意味最初の2つのパラメータ、   コマンドラインパーサーを含める必要があります。戻る16ビットの時代に、   人々はすべてのバイトを保存するためにscrimped。ああ」、それらを告げると、すべてのあなた   プログラムは、おそらくあなたに多くのことをすることはないだろう「2キロバイト大きくなるとしています   友人の。私が意味する、それはフロッピーディスクからI / Oの4つのセクターです!

     

しかし、Windowsのエントリポイントが与えられた理由はおそらく理由   別の名前が、それは別の実行だことを強調することです   環境。それは、メインと呼ばれていた場合、人々はCプログラムを取ります   コンソール環境用に設計された、彼らのWindowsにそれらを投げます   コンパイラは、その後、悲惨な結果で、それらを実行します。

は、これがあなたの疑問をクリア願っています。

これは、他の方法で動作します。実際のエントリポイントを保持しているコンパイラが付属して静的にリンクされたオブジェクト・ファイルがあります。そのエントリポイントが初期化を行い、その後、あなたのエントリポイント(すなわち、WinMain関数)を呼び出します。

その静的な部分が微調整できるかもしれ呼び出すために期待するもの。たとえば、Visual Studioでのエントリポイント名の欄には、リンカの設定にあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top