1

为什么 QApp 构造函数因WinMain参数而失败?

 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

Qt 应用程序QApplication主对象应该在标准主函数中创建:

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() 请注意,必须在main()函数运行之前初始化 C 运行时,这可能取决于编译器/链接器。并且还找到了一个Qt应用程序主函数的例子。

我猜想,当您通过引入nShowCmd == 0使代码不崩溃时,QApplication对象不会读取命令行,这会防止通过解释为_lpCmdLine. 但这仍然是错误的并且QApplication对象的不完整初始化。

作者没有看到窗口,而是看到了控制台,这与 main 函数的不完整代码没有启动任何窗口有关。此外,QML 应用程序 main.cpp可能会有所帮助。

于 2016-01-14T06:27:56.020 回答
0

由于这个问题再次与 Qt6 相关,这是一个非常简单的 VisualStudio 解决方案,使用 WinMain 作为入口点:

QApplication app(__argc, __argv);

__argc 和 __argv 由微软编译器填充(在这里找到这个建议:https ://codingmisadventures.wordpress.com/2009/03/10/retrieving-command-line-parameters-from-winmain-in-win32/ )

问题的简短解释:在 VC 中使用 main() 需要使用 Subsystem:Console,但这总是会打开一个控制台窗口,您通常希望避免这种情况。你无法摆脱这个控制台,除非有一些非常肮脏的黑客。因此,您需要切换到 Subsystem:Windows 以启动“静默”应用程序,但这需要使用 WinMain() 作为应用程序入口点。在 Qt5 之前,qtmain.lib 中有一个自己的 WinMain() 实现,您只需将其链接进去,然后转发给 main() 函数,但这在 Qt6 中已被淘汰。该问题仅对 MSVC 用户存在 afaik,因为使用 mingw 您可以禁用控制台窗口并继续使用 main(),如 Qt 示例中所示。

于 2021-05-09T18:06:09.447 回答