首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么winmain参数不匹配?

为什么winmain参数不匹配?
EN

Stack Overflow用户
提问于 2016-01-14 05:48:13
回答 2查看 702关注 0票数 1

为什么QApp构造函数在WinMain参数中失败?

代码语言:javascript
复制
 int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPTSTR _lpCmdLine, int _nShowCmd) {
    QApplication app(_nShowCmd, & _lpCmdLine);

在这里,它例外地失败了:

代码语言:javascript
复制
Exception at adress 0x0F3621DC (Qt5Guid.dll) in updater_app.exe: 0xC0000005

出什么事了?怎么修呢?

UPD:

它以这样的方式工作:

代码语言:javascript
复制
int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPTSTR _lpCmdLine, int _nShowCmd) {

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

_lpCmdLine为10,_nShowCmd为空字符串,因此不匹配。为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-14 06:27:56

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

代码语言:javascript
复制
int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   // more app objects initialization
   return app.exec();
}

而你做到了:

代码语言:javascript
复制
int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPTSTR _lpCmdLine, int _nShowCmd)
{
   QApplication app(nShowCmd, & _lpCmdLine);
   return app.exec();
}

这意味着&_lpCdLine等同于argv,但是:

LPTSTR _lpCmdLine是一个等价于char*的地址,因此当&_lpCmdLine指向一个连续的字符缓冲区而不是字符串数组为argv时,_lpCmdLinechar**匹配。

考虑main()函数是如何在Windows上实现的是有意义的。有一个很好的讨论:WINMAIN和main()在C++ (扩展)中的应用注意,在运行main()函数之前,必须初始化C运行时,这可能取决于编译器/链接器。还可以找到Qt应用主要功能的一个例子。

我猜想,当您通过引入n nShowCmd == 0使代码不崩溃时,QApplication对象就不会读取命令行,从而防止通过解释为_lpCmdLine中地址的随机内容进行不正确的访问。但这仍然是错误的,也是QApplication对象的不完全弱化。

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

票数 2
EN

Stack Overflow用户

发布于 2021-05-09 18:06:09

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

代码语言:javascript
复制
QApplication app(__argc, __argv);

__argc和__argv由microsoft编译器填充(在这里发现了以下建议: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()-function,但这在Qt6中已经被排除在外。afaik问题只存在于MSVC用户,因为使用mingw,您可以禁用控制台窗口并继续使用main(),如Qt-示例所示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34782497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档