C ++:实现自定义Main函数

时间:2013-03-28 19:07:41

标签: c++ dll dynamic-library

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()函数,因此会抛出“未解析的外部符号”编译错误。那么如何将其封装起来呢?

3 个答案:

答案 0 :(得分:3)

您必须决定自定义主函数的签名并将其声明为“extern”(在C ++的情况下为extern“C”)。然后,应用程序代码必须定义该函数并链接到具有实际_main入口点的静态库。例如:

extern "C" int my_main(int argc, char *argv[]);

int main(int argc, char *argv[])
{
    return my_main(argc, argv);
}

答案 1 :(得分:2)

链接器默认入口点名称为“main”。 您可以覆盖默认值以使用您想要的任何功能开始。

/ENTRY (Entry-Point Symbol)

答案 2 :(得分:2)

实际上,真正的切入点既不是主要的也不是WinMain。真正的切入点是wWinMainCRTStartup,WinMainCRTStartup,wmainCRTStartup和mainCRTStartup之一。但它们没有在Windows.h中定义,它们是CRT的一部分。您可以在<VS installation folder> \ VC \ crt \ src \ crtexe.c中查看其代码。它们各自进行一些初始化,然后分别调用wWinMain,WinMain,wmain和main之一。

正如其他人所提到的,您可以使用/ ENTRY开关覆盖入口点,但您仍然无法使用自定义参数,这就是您想要首先执行此操作的全部原因。