C/C++启动函数会调用应用程序的入口点函数。比如我们写了一个_tWinMain函数,且定义了_UNICODE
其调用过程如下:
GetStartupInfo(&StartupInfo);
int nMainRetVal = wWinMain((HINSTANCE)&__ImageBase, NULL, pszCommandLineUnicode,
(StartupInfo.dwFlags & STARTF_USESHOWWINDOW)
? StartupInfo.wShowWindow : SW_SHOWDEFAULT);
如果没有定义_UNICODE,其调用过程将如下所示:
GetStartupInfo(&StartupInfo);
int nMainRetVal = WinMain((HINSTANCE)&__ImageBase, NULL, pszCommandLineAnsi,
(StartupInfo.dwFlags & STARTF_USESHOWWINDOW)
? StartupInfo.wShowWindow : SW_SHOWDEFAULT);
注意_ImageBase是一个链接器定义的伪变量,可执行文件都被映射到应用程序内存中的什么位置以后讨论。
现在 我们如果写了一个_main函数,可以定义?_UNICODE其调用过程如下:
int nMainRetVal = wmain(argc, argv, envp);
没定义_UNICODE,调用过程如下:
int nMainRetVal = main(argc, argv, envp);
另外注意用Visual Studio 生成的应用程序CUI是没有入口点的第3个参数
int _tmain(int argc, TCHAR* argv[]);
要自己添加成
int _tmain(int argc, TCHAR* argv[], TCHAR* env[])
env参数指向一个参数,所有环境变量和值 都用等号(=)分隔。
为安全起见 Microsoft 并不赞成使用所有这些变量,因为使用了这些变量代码可能会在C运行库初始化这些变量之前开始执行,因此我们应该直接调用对于的WindowsAPI函数
9 7 3 1 2 3 4 8 :
本文来源:不详 作者:佚名