Замена 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
}
}
Спасибо.
Ответы
Ответ 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.
Ответ 2
GetModuleHandle(NULL)
даст вам hInstance
. hPrevInstance
всегда NULL
.
Ответ 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 ....
}
Вы можете скрыть первую строку, поместив ее в другой файл