3

古い bcc32 (borland 5.5) を使用しています (これが非常に古いコンパイラであることは知っていますが、使用しないようにとは言いません)。

コンソールまたは Windows サブシステムでコンパイルできます。

Windowsサブシステムでコンパイルしたくありません.main()と「windows.h」インクルードのないコンソールが欲しいです(そこから、ウィンドウを開いてメッセージポンプを内部的に処理する独自のライブラリを呼び出します)

それは動作しますが、問題は、コンソールサブシステムでコンパイルすると、醜い青いコンソールウィンドウが表示され、それは必要ないということです

したがって、Windowsサブシステムのコンパイルもコンソールサブシステムのコンパイルも必要なく、プログラムを生のモードでコンパイルするだけでよいと思います(コンソールの作成とWinMainエントリポイントの両方なしで-どうすればいいですか?

4

1 に答える 1

5

一般に、コンソールが必要ない場合は、「GUI」または「Windows」サブシステムを選択する必要があります (開発環境での呼び出しに応じて)。これは、リンカーが EXE ヘッダーに設定するビットを制御します。OSはプログラム内のコードを実行する前に、EXE ファイルを読み取り、使用するサブシステムを決定するため、プログラムの実行が開始された後はサブシステムを制御できません。

Windows サブシステムを使用する場合、ウィンドウは必要ありません。プログラムを読み込んでいるときに、コンソールが必要ないことをOSに伝えるだけです。Windows API を使用するかどうかとは関係ありません。どちらのサブシステムも本格的な Windows アプリケーションであり、Windows API 機能をフルに活用できます。

WinMainからできることと同じことをすべて から行うことができますmainコマンド ラインをフェッチし、それを個別の引数に分割する関数があります。

ただし、メイン関数を呼び出したくWinMainない場合は、Windows サブシステムを使用できません。サブシステムの選択は、リンカがプログラムに挿入する準備コードのセットも制御します。準備コードは、プログラムの実際のエントリ ポイントが存在する場所であり、C++ 標準ライブラリを初期化し、名前空間スコープを持つオブジェクトのコンストラクターを呼び出すものです。コンソール モード呼び出しmain(またはwmain) に含まれるコード。Windows サブシステム呼び出し用にリンクされたコードWinMain(またはwWinMain)。Windows サブシステムを使用し、 という名前の関数を定義しないとWinMain、リンク時にエラーが発生します。リンカーは、未定義の関数について文句を言います。(定義するためにwindows.hを含める必要はありません。WinMain、そのヘッダーを含めることが恐れている場合。)

使用するサブシステムは EXE ヘッダー内のビットのセットにすぎないため、editbinプログラムとのリンクが発生した後に変更します。リンクするときは、コンソール サブシステムを選択してコンソール準備コードと を取得し、main代わりに Windows サブシステムを使用するようにバイナリを変更します。

リンク foo.obj /out foo.exe /subsystem:CONSOLE
editbin /サブシステム:WINDOWS foo.exe

その後、プログラムはコンソールなしで実行されます。起動中に問題が発生した場合、準備コードがプログラムをクラッシュさせる可能性があることに注意してください。これは、書き込み可能なコンソールがあることを期待して書かれているが、そこにないためです。

于 2013-04-21T16:05:41.877 に答える