1

WinMainパラメータでQAppコンストラクタが失敗するのはなぜですか?

 int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPTSTR _lpCmdLine, int _nShowCmd) {
    QApplication app(_nShowCmd, & _lpCmdLine);

そして、ここでは例外で失敗します:

Exception at adress 0x0F3621DC (Qt5Guid.dll) in updater_app.exe: 0xC0000005

どうしたの?それを修正する方法は?

更新:

そして、それは次のように機能します:

int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPTSTR _lpCmdLine, int _nShowCmd) {

int nShowCmd(0);
QApplication app(nShowCmd, & _lpCmdLine);

_lpCmdLineは 10 で_nShowCmd空の文字列なので、一致しません。なんで?

4

2 に答える 2

2

QApplication標準の main 関数で作成されるはずの Qt アプリケーションのメイン オブジェクト:

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   // more app objects initialization
   return app.exec();
}

あなたがやる:

int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPTSTR _lpCmdLine, int _nShowCmd)
{
   QApplication app(nShowCmd, & _lpCmdLine);
   return app.exec();
}

これは、以下&_lpCdLineと同等であることを意味しargvます:

LPTSTR _lpCmdLineこれは と同等でchar*あり、そのアドレスを取るので、 が文字列の配列ではなく、連続した文字のバッファを指している場合に&_lpCmdLine一致します。char**_lpCmdLineargv

main()関数が Windows でどのように実装されているかを検討することは理にかなっています。良い議論があります: C++ の WINMAIN と main() (拡張)関数を実行する前に C ランタイムを初期化する必要がありmain()、コンパイラ/リンカーに依存する可能性があることに注意してください。また、 Qt アプリケーションの main 関数の例も見つけてください。

n を導入してコードがクラッシュしないようにする場合、nShowCmd == 0オブジェクトQApplicationがコマンドラインを読み取らないようになり、_lpCmdLine. QApplicationしかし、それはまだ間違っており、オブジェクトの不完全な初期化です。

作成者はウィンドウを表示できず、代わりにコンソールが表示されます。これは、ウィンドウを起動しない main 関数の不完全なコードに関連しています。また、QML アプリケーションの main.cppも役立つ場合があります。

于 2016-01-14T06:27:56.020 に答える
0

この問題は Qt6 で再び関連するようになるため、WinMain をエントリ ポイントとして使用する VisualStudio の非常に単純なソリューションを次に示します。

QApplication app(__argc, __argv);

__argc および __argv は、Microsoft コンパイラによって取り込まれます (この提案はこちらにあります: https://codingmisadventures.wordpress.com/2009/03/10/retrifying-command-line-parameters-from-winmain-in-win32/ )

問題の簡単な説明: VC で main() を使用するには Subsystem:Console を使用する必要がありますが、これにより常にコンソール ウィンドウが開きますが、これは通常は避けたいものです。非常に汚いハックを除いて、このコンソールを取り除くことはできません。そのため、「サイレント」アプリケーションを起動するには Subsystem:Windows に切り替える必要がありますが、これにはアプリケーションのエントリ ポイントとして WinMain() を使用する必要があります。Qt5 までは、qtmain.lib に WinMain() の独自の実装がありました。これは単純にリンクされ、main() 関数に転送されますが、これは Qt6 で追い出されました。Qt の例に示すように、mingw を使用するとコンソール ウィンドウを無効にして main() を引き続き使用できるため、この問題は MSVC ユーザーにのみ存在します。

于 2021-05-09T18:06:09.447 に答える