Почему параметры winmain не соответствуют друг другу?
Почему конструктор 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
пустая строка - значит она не совпадает Зачем?
2 ответа
Приложение 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 _lpCmdLine
что эквивалентно char*
и вы берете адрес так &_lpCmdLine
Матчи char**
когда _lpCmdLine
указывает на непрерывный буфер символов, а не массив строк символов, как argv
,
Имеет смысл рассмотреть, как main()
Функция реализована в Windows. Есть хорошее обсуждение: WINMAIN и main() в C++ (Extended). Помните, что среда выполнения C должна быть инициализирована до main()
Функция запускается, и это может зависеть от компилятора / компоновщика. А также найдите пример основной функции приложения Qt.
Я предполагаю, что тот случай, когда вы делаете свой код, чтобы не сбои, представляя nShowCmd == 0
марки QApplication
объект не для чтения командной строки, которая предотвращает неправильный доступ через случайный контент, интерпретируемый как адреса в _lpCmdLine
, Но это все еще неправильно и неполная инициализация QApplication
объект.
Авторы не видят окно и вместо этого видят консоль, что относится к неполному коду основной функции, не запускающему окно. Также может помочь приложение QML main.cpp.
Поскольку эта проблема снова становится актуальной с Qt6, вот очень простое решение для VisualStudio с использованием WinMain в качестве точки входа:
QApplication app(__argc, __argv);
__argc и __argv заполняются компилятором microsoft (это предложение можно найти здесь: https://codingmisadventures.wordpress.com/2009/03/10/retrieving-command-line-parameters-from-winmain-in-win32/)
Краткое объяснение проблемы: использование main () с VC требует использования Subsystem:Console, но при этом всегда открывается окно консоли, чего обычно следует избегать. Вы не можете избавиться от этой консоли, кроме как с помощью очень грязных хаков. Таким образом, вам нужно переключиться на Subsystem:Windows, чтобы запускать приложение «тихо», но для этого необходимо использовать WinMain() в качестве точки входа в приложение. Вплоть до Qt5 была собственная реализация WinMain() в qtmain.lib, которую вы просто связали и которая перенаправляла в функцию main (), но это было исключено в Qt6. Проблема существует только для пользователей MSVC, потому что с помощью mingw вы можете отключить окно консоли и продолжить использование main (), как показано в Qt-примерах.