Подтвердить что ты не робот

Замена WinMain() функцией main() в программах Win32

Я немного искал StackOverflow и Google, но не мог понять. Я хочу запустить приложение с этим типом пользовательского программирования:

int main()
{
  Window App("Test", 640, 480);

  while(App.IsOpen())
  {
    // Do the stuff
  }
}

Но это невозможно, потому что я должен передать hInstance и hPrevInstance и другие параметры функции WinMain. На самом деле есть класс Window, который я разработал, чтобы сделать создание Window немного легче. Я видел эту реализацию на SFML, но я не знаю, как это получилось.

Сейчас я использую обычный способ:

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR, int)
{
  Window App(hInst, hPrevInst, "Test", 640, 480);

  while(App.IsOpen())
  {
    // Do the stuff
  }
}

Спасибо.

4b9b3361

Ответ 1

Вы можете использовать стандартный main в приложении "Windows" (то есть приложение Windows подсистемы GUI) даже с инструментами Microsoft, если вы добавите следующие параметры компоновщика Microsoft:

/subsystem:windows /ENTRY:mainCRTStartup

Обратите внимание, что это необязательно для инструментальной цепочки GNU.

Тем не менее для инструментов Microsoft вы также можете добавить это в свой основной файл:

#ifdef _MSC_VER
#    pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif

@Джеймс Макнеллис рассказывает вам, как получить hInstance.

Ответ 3

Во-первых, GetModuleHandle(0) предоставляет дескриптор исполняемого модуля, который совпадает с аргументом hInstance WinMain.

С помощью инструментария GNU (компилятор g++) нормальный код в порядке.

Инструментальная цепочка Microsoft, однако, принимает только стандартно-совместимый код по умолчанию для исполняемого файла подсистемы консоли. Чтобы создать исполняемый файл подсистемы GUI с помощью этой несоответствующей инструментальной цепочки, используя стандартный main, вы должны указать точку входа библиотеки Microsoft, которая вызывает стандартную main, а именно mainCRTStartup. Для вызова командной строки, который означает & hellip;

cl myApp.cpp /link /entry:mainCRTStartup /subsystem:windows user32.lib

В практическом плане для работы в командной строке вы можете просто указать точку входа в переменной среды LINK:

set LINK=/entry:mainCRTStartup

& hellip;

cl myApp.cpp /link /subsystem:windows user32.lib

Создание подобной стандартной настройки для Visual Studio, возможно, нежелательно, поскольку некоторые типы проектов Visual Studio (в основном, MFC) требуют использования Microsoft нестандартных WinMain или wWinMain.

Ответ 4

hInstance является одним из исключений из правила "никогда не использовать глобальные переменные". Обычно никакая переменная на самом деле логически не имеет области, охватывающей весь модуль. hInstance, тем не менее, имеет по определению точно модульную область видимости, поэтому на самом деле наиболее логичным решением является создание глобальной переменной для нее и инициализация ее в WinMain.

Как и другие, вы также можете использовать GetModuleHandle(NULL).

Ответ 5

Простой:

#define MainCode int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow)


MainCode
{
.... your code here ....
}

Вы можете скрыть первую строку, поместив ее в другой файл