Visual studio 为什么winmain参数不';你们不匹配吗?
为什么QApp构造函数使用Visual studio 为什么winmain参数不';你们不匹配吗?,visual-studio,qt,winmain,qapplication,Visual Studio,Qt,Winmain,Qapplication,为什么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 怎么了
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);
\u lpCmdLine
是10,而\u nShowCmd
是空字符串-因此它不匹配。为什么?Qt应用程序QApplication
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\u lpCmdLine
相当于char*
,您可以获取它的地址,因此&\u lpCmdLine
匹配char**
当\u lpCmdLine
指向连续的字符缓冲区而不是argv
那样的字符串数组时
考虑如何在Windows上实现<代码>主()>代码>函数是有意义的。这里有一个很好的讨论:请注意,C运行时必须在main()
函数运行之前初始化,这可能取决于编译器/链接器。并找到一个例子
我猜,当您通过引入gnnShowCmd==0使代码不崩溃时,会使QApplication
对象不读取命令行,从而防止通过解释为\u lpCmdLine
中地址的随机内容进行错误访问。但这仍然是错误的,QApplication
对象的初始化不完整
作者没有看到窗口,而是看到控制台,这与主函数的代码不完整有关,没有启动任何窗口。另外,这可能会有所帮助。由于此问题再次与Qt6相关,下面是一个非常简单的VisualStudio解决方案,使用WinMain作为入口点:
QApplication app(__argc, __argv);
__argc和_argv由microsoft编译器填充
(在此处找到此建议:)
简要说明问题:在VC中使用main()需要使用Subsystem:Console,但这总是会打开一个控制台窗口,这通常是您想要避免的。你不能摆脱这个控制台,除非有一些非常肮脏的黑客。因此,您需要切换到Subsystem:Windows以进行“静默”应用程序启动,但这需要使用WinMain()作为应用程序入口点。在Qt5之前,在qtmain.lib中有一个自己的WinMain()实现,您只需将其链接到其中,并将其转发到main()-函数,但在Qt6中已将其删除。这个问题只适用于MSVC用户,因为使用mingw可以禁用控制台窗口并继续使用main(),如Qt示例所示。你是对的,使用main()它工作得很好,但我不需要控制台窗口,所以使用winmain。是否可以使用main()而不显示控制台?然后启动一些小部件窗口。你的确切密码是什么?请参阅Qt示例我启动QML GUI,但在加载之前(需要一些时间)控制台窗口会显示。需要您的确切代码。QML并不意味着控制台窗口。这是主要的功能问题。那里有点不对劲。