入口函数WinMain详解

类似于C程序的main函数,Win32应用程序也有一个入口函数WinMain,该函数被系统自动调用

函数原型:

int WINAPI WinMain(

    HINSTANCE hInstance,     //应用程序当前实例的句柄

    HINSTANCE hPrevInstance, //应用程序的先前实例的句柄。同一个程序打开两次,出现两个窗口,

                第一次打开的窗口就是先前实例的窗口。

                对于一个32位程序,该参数总为NULL

    LPSTR lpCmdLine,         //命令行的字符串的指针

    int nCmdShow             //窗口显示方式、默认为SW_SHOWDEFAULT

    ){


}

示例:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ 
	
	MessageBox(NULL, L"第一个win32程序", L"消息", MB_OK);
	
	return 0;
}

扩展阅读:

奇怪的字符:

符号原型说明
WINAPI#define WINAPI      __stdcall标准调用约定、_stdcall是专门用来调用Win API的
HINSTANCE
一个结构体类型指针
LPSTR
字符串的指针  即 char* 类型
HANFLEtypedef void * HANDLE;就是一个人void类型的指针

应用程序实例句柄:

WinMain函数的第一个参数hInstance就是可执行文件的实例句柄,实际上是个内存地址,它指出系统在何处把EXE文件装载入进程的地址空间!


在Windows应用程序中,总需要加载应用程序文件(exe)到系统内存里,为了标识每个文件

在内存的区别,Windows使用了句柄来标识这些文件。比如在一个应用程序里,有一个可执行文

件(EXE)和多个动态连接库文件(DLL),这时可以标识可执行文件为Ox1D000000,动态连接

库文件为Ox1D001000。这里的值只是举例,当系统运行应用程序时,就会分配实际的值给应用程

序。加载到进程地址空间的每一个可执行文件或是DLL文件都被赋予了一个唯一的实例句柄,在调

用装入资源的时候需要该句柄值!


我们可以通过下面这个函数来获取调用进程中某个模块的基地址:

HMODULE GetModuleHandle( PCTSTRlpModuleName);

功能:获取一个特定的应用程序或动态链接库的模块句柄,且这个模块必须已经被加载到调用者的

进程空间中,参数传NULL将返回自身应用程序句柄!