3

WinMain()実際にはどのように呼ばれますか?のように見える (何か) で始まるプロハッカーによって使用された関数を覚えています__startupWinMain()

問題は、Win32 EXE (でコンパイル/SUBSYSTEM:WINDOWS) を持っていますが、コマンドラインから引数を取得することです。コマンド ラインが正しくない場合、プロセスはコンソールにヘルプ メッセージを出力する必要があります。

リンカー オプションFreeConsole()を使用して exe から手動で割り当てを解除 (または) するにはどうすればよいですか?/SUBSYSTEM:WINDOWS

4

4 に答える 4

3

プログラムの最初の作業として、パラメーターを確認します。問題がなければ、通常どおり続行します。

AttachConsoleそれ以外の場合は、 passing を呼び出しますATTACH_PARENT_PROCESS。それが成功した場合は、エラーを標準出力に出力して終了できます。そうでない場合は、メッセージ ボックスにエラーを表示する必要があります。

于 2013-03-04T19:52:35.043 に答える
1

おそらく、コマンドラインが正しくないときにプログラムにメッセージボックスをポップアップさせることを検討する必要があります。このようなもの:

MessageBox( NULL, "(description of command line error)",
            "MyProg - Command Line Error",
            MB_OK|MB_ICONEXCLAMATION );

これにより、ディスプレイの中央にメッセージボックスが開き、ユーザーが確認するのを待ってから、プログラムを実際に終了します。

一方、プログラムをコンソールアプリとしてビルドし、コンソールprintf()への書き込みに使用することもできます。コンソールプログラムは引き続きウィンドウを作成する場合がありますが、コンソールから切り離す方法を理解しない限り、コンソール自体はハングします(もちろん、コンソールは使用できなくなりますprintf())。

于 2013-03-04T19:36:57.843 に答える
0

WinMain() は実際にどのように呼び出されますか?

デバッガーでプログラムの最初の行にシングル ステップで移動し、スタックを確認すると、WinMain がどのように呼び出されるかがわかります。通常のビルドの実際の開始関数は、ランタイム ライブラリから取り込まれた関数です。私にとって_WinMainCRTStartupは . ランタイム ライブラリのスタートアップ関数は、初期化を行ってから WinMain を呼び出します。

(または PE バイナリを検査できる別のプログラム) を使用dumpbin /headersして、どの関数が実行可能ファイルへの「エントリ ポイント」であるかを確認できます。何か変更を加えていない限り、おそらく が表示されます。_WinMainCRTStartupこれは、スタック トレースが示す内容と一致しています。

それはあなたの質問に答えるはずですが、あなたの問題は解決しません。他の人が良い解決策を投稿しているようです。

于 2013-04-18T16:31:15.483 に答える