Windows 应用程序必须有一个入口点函数,应用程序开始运行时,这个函数会被调用。使用Win32 SDK开发程序的入口函数如下:
int WINAPI WinMain(
HINSTANCE hInstanceExe,
HINSTANCE,
PTSTR pszCmdLine,
int nCmdShow);
1)hInstanceExe参数实际值是一个内存基地址;系统将可执行文件的映像加载到进程地址空间中的这个位置。例如,系统打开可执行文件,并将它的内容加载到地址0x00400000,则(w)WinMain的hInstanceExe参数值为0x00400000.
可执行文件的映像具体加载到哪一个基地址,是由链接器决定的。
2)第二个参数用于16位Windows系统,对32位系统都应传递NULL
3)pszCmdLine 是用来运行程序的命令行。有些Windows程序在启动时用它来把文件装入内存
4)nCmdShow 用来指明程序最初如何显示(正常显示、最大化到全屏、最小化到任务栏)
操作系统实际上并不调用我们所写的入口点函数。相反,它会调用由C/C++运行库实现并在链接时使用-entry:命令行选项来设置的一个C/C++运行时启动函数。该函数将初始化C/C++运行库,使我们能调用malloc和free之类的函数。它还确保了在我们的代码开始执行之前,我们声明的任何全局和静态C++对象都被正确构造。
其中开头的w表示Unicode版本。
GetStartupInfo(&StartupInfo);
int nMainRetVal = wWinMain((HINSTANCE)&__ImageBase, NULL, pszCommandLineUnicode,
(StartupInfo.dwFlags & STARTF_USESHOWWINDOW) ? StartupInfo.wShowWindow : SW_SHOWDEFAULT);
_ImageBase是一个链接器定义的伪变量,表明可执行文件被映射到应用程序内存中的什么位置。
4)调用操作系统的ExitProcess函数,向其传入nMainRetVal。这会导致操作系统“杀死”我们的进程,并设置它的退出码。
/*
* HelloMsg.c -- Displays "Hello, Windows" in a message box
* [email protected]
* 2012-11-6
*/
#include
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)
{
MessageBox(NULL, TEXT("Hello Windows!"), TEXT("HelloMsg"), 0);
return 0;
}