WinMain — это функция, которая «заменяет» основную точку входа по умолчанию «main».
Пользователь может затем определить свою основную точку входа, как
int WINAPI WinMain(...) { }
Как делается этот вид инкапсуляции?
Ну, скорее всего, в какой-то момент это выглядит так:
int main() // This must be defined somewhere in windows.h
{
return WinMain(...);
}
Вопрос: Как я могу выполнить такую инкапсуляцию самостоятельно, которая затем вызывает WinMain? Примечание: библиотека, которую я создал, является DLL, поэтому она будет выглядеть так:
// This is the minimal code for the application which uses 'MyLibrary'
#pragma comment(lib, "MyLibrary.lib")
include "MyLibrary.h"
void Main(MyCustomParameter *params)
{
// Write user code here
}
Эта проблема однако, DLL не «знает» Main()
и, следовательно, генерирует ошибку компиляции «неразрешенный внешний символ». Так как я могу заключить это в капсулу, как это?
Вы должны выбрать сигнатуру своей пользовательской функции main и объявить ее как «extern» (extern «C» в случае C ++). Затем код приложения должен будет определить эту функцию и связать ее с вашей статической библиотекой, которая имеет _main
точка входа. Например:
extern "C" int my_main(int argc, char *argv[]);
int main(int argc, char *argv[])
{
return my_main(argc, argv);
}
Имя точки входа компоновщика по умолчанию «main».
Вы можете переопределить значение по умолчанию, чтобы начать с любой функции, которую вы хотите.
На самом деле, реальная точка входа не является ни основной, ни WinMain. Реальной точкой входа является одна из wWinMainCRTStartup, WinMainCRTStartup, wmainCRTStartup и mainCRTStartup. Но они не определены в Windows.h, они являются частью CRT. Вы можете увидеть их код в <VS installation folder>
\ VC \ элт \ SRC \ crtexe.c. Каждый из них выполняет некоторую инициализацию, а затем вызывает один из wWinMain, WinMain, wmain и main соответственно.
Как уже упоминалось, вы можете переопределить точку входа с помощью переключателя / ENTRY, но у вас по-прежнему не может быть пользовательских параметров, и это единственная причина, по которой вы хотите сделать это в первую очередь.