入口函数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* 类型 | |
HANFLE | typedef void * HANDLE; | 就是一个人void类型的指针 |
应用程序实例句柄:
WinMain函数的第一个参数hInstance就是可执行文件的实例句柄,实际上是个内存地址,它指出系统在何处把EXE文件装载入进程的地址空间!
在Windows应用程序中,总需要加载应用程序文件(exe)到系统内存里,为了标识每个文件
在内存的区别,Windows使用了句柄来标识这些文件。比如在一个应用程序里,有一个可执行文
件(EXE)和多个动态连接库文件(DLL),这时可以标识可执行文件为Ox1D000000,动态连接
库文件为Ox1D001000。这里的值只是举例,当系统运行应用程序时,就会分配实际的值给应用程
序。加载到进程地址空间的每一个可执行文件或是DLL文件都被赋予了一个唯一的实例句柄,在调
用装入资源的时候需要该句柄值!
我们可以通过下面这个函数来获取调用进程中某个模块的基地址:
HMODULE GetModuleHandle( PCTSTRlpModuleName);
功能:获取一个特定的应用程序或动态链接库的模块句柄,且这个模块必须已经被加载到调用者的
进程空间中,参数传NULL将返回自身应用程序句柄!