为什么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出什么事了?怎么修呢?
UPD:
它以这样的方式工作:
int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPTSTR _lpCmdLine, int _nShowCmd) {
int nShowCmd(0);
QApplication app(nShowCmd, & _lpCmdLine);_lpCmdLine为10,_nShowCmd为空字符串,因此不匹配。为什么?
发布于 2016-01-14 06:27:56
Qt应用程序QApplication main对象应该在标准main函数中创建:
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指向一个连续的字符缓冲区而不是字符串数组为argv时,_lpCmdLine与char**匹配。
考虑main()函数是如何在Windows上实现的是有意义的。有一个很好的讨论:WINMAIN和main()在C++ (扩展)中的应用注意,在运行main()函数之前,必须初始化C运行时,这可能取决于编译器/链接器。还可以找到Qt应用主要功能的一个例子。
我猜想,当您通过引入n nShowCmd == 0使代码不崩溃时,QApplication对象就不会读取命令行,从而防止通过解释为_lpCmdLine中地址的随机内容进行不正确的访问。但这仍然是错误的,也是QApplication对象的不完全弱化。
作者没有看到窗口,而是看到控制台,这涉及到不完整的主函数代码,没有启动任何窗口。此外,QML应用main.cpp可能会有所帮助。
发布于 2021-05-09 18:06:09
由于这个问题与Qt6再次相关,下面是使用WinMain作为入口点的VisualStudio的一个非常简单的解决方案:
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-示例所示。
https://stackoverflow.com/questions/34782497
复制相似问题