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()
函数,因此会抛出“未解析的外部符号”编译错误。那么如何将其封装起来呢?
答案 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”。 您可以覆盖默认值以使用您想要的任何功能开始。
答案 2 :(得分:2)
实际上,真正的切入点既不是主要的也不是WinMain。真正的切入点是wWinMainCRTStartup,WinMainCRTStartup,wmainCRTStartup和mainCRTStartup之一。但它们没有在Windows.h中定义,它们是CRT的一部分。您可以在<VS installation folder>
\ VC \ crt \ src \ crtexe.c中查看其代码。它们各自进行一些初始化,然后分别调用wWinMain,WinMain,wmain和main之一。
正如其他人所提到的,您可以使用/ ENTRY开关覆盖入口点,但您仍然无法使用自定义参数,这就是您想要首先执行此操作的全部原因。