Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 为什么winmain参数不';你们不匹配吗?_Visual Studio_Qt_Winmain_Qapplication - Fatal编程技术网

Visual studio 为什么winmain参数不';你们不匹配吗?

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 怎么了

为什么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);

\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()
函数运行之前初始化,这可能取决于编译器/链接器。并找到一个例子

我猜,当您通过引入gn
nShowCmd==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并不意味着控制台窗口。这是主要的功能问题。那里有点不对劲。