dll — C ++: реализовать пользовательскую функцию Main

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() и, следовательно, генерирует ошибку компиляции «неразрешенный внешний символ». Так как я могу заключить это в капсулу, как это?

5

Решение

Вы должны выбрать сигнатуру своей пользовательской функции 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);
}
3

Другие решения

Имя точки входа компоновщика по умолчанию «main».
Вы можете переопределить значение по умолчанию, чтобы начать с любой функции, которую вы хотите.

/ ENTRY (символ точки входа)

2

На самом деле, реальная точка входа не является ни основной, ни WinMain. Реальной точкой входа является одна из wWinMainCRTStartup, WinMainCRTStartup, wmainCRTStartup и mainCRTStartup. Но они не определены в Windows.h, они являются частью CRT. Вы можете увидеть их код в <VS installation folder>\ VC \ элт \ SRC \ crtexe.c. Каждый из них выполняет некоторую инициализацию, а затем вызывает один из wWinMain, WinMain, wmain и main соответственно.

Как уже упоминалось, вы можете переопределить точку входа с помощью переключателя / ENTRY, но у вас по-прежнему не может быть пользовательских параметров, и это единственная причина, по которой вы хотите сделать это в первую очередь.

2
По вопросам рекламы [email protected]