Почему параметры 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-примерах.

Другие вопросы по тегам