Windows程序入口

WinMain:应用程序入口点

每个Windows程序都包括名为 WinMain 或 wWinMain 的入口点函数。 下面是 wWinMain 的签名。

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);

这四个参数为:

hInstance 称为"实例句柄"或"模块句柄"。 操作系统使用此值来标识 EXE (加载到) 可执行文件。 某些函数需要实例句柄Windows例如,加载图标或位图。
hPrevInstance 没有意义。 它用于 16 位Windows,但现在始终为零。
pCmdLine 包含作为 Unicode 字符串的命令行参数。
nCmdShow 是一个标志,指示主应用程序窗口是最小化、最大化还是正常显示。

数返回 int 值。 返回值不由操作系统使用,但可以使用返回值将状态代码传达给你编写的其他程序。

WINAPI 是调用约定。 调用 约定 定义函数如何从调用方接收参数。 例如,它定义参数在堆栈上的显示顺序。 只需确保声明 wWinMain 函数,如下所示。

WinMain 函数与 wWinMain 相同,只是命令行参数作为 ANSI 字符串传递。 Unicode 版本为首选。 即使将程序编译为 Unicode,也可使用 ANSI WinMain 函数。 若要获取命令行参数的 Unicode 副本,请调用 GetCommandLine 函数。 此函数返回单个字符串中的所有参数。 如果希望参数作为 argv 样式数组,请传递此字符串到 CommandLineToArgvW

编译器如何知道调用 wWinMain 而不是标准 main 函数? 实际发生的情况是,Microsoft C 运行时库 (CRT) 提供了调用 WinMain 或 wWinMain 的 main 的实现。

CRT 在主 中执行一些 额外的工作。 例如,在 wWinMain 之前调用任何静态初始值设置。 尽管可以告知链接器使用不同的入口点函数,但如果链接到 CRT,请使用默认值。 否则,将跳过 CRT 初始化代码,并出现不可预知的结果。 (例如,无法正确初始化全局对象。)

/ENTRY 选项将入口点函数指定为 .exe 文件或 DLL 的起始地址。
必须定义函数才能使用 __stdcall 调用约定。 如果程序为控制台应用程序、windows 应用程序或 DLL,则参数和返回值将依赖于。 建议使链接器设置入口点,以便正确初始化 C 运行时库,并执行静态对象的 c + + 构造函数。
默认情况下,起始地址是 C 运行库中的函数名称。 链接器将根据程序的属性选择该属性,如下表所示。
备注
函数名称 默认值
mainCRTStartup (或 wmainCRTStartup) 使用/SUBSYSTEM:控制台的应用程序;调用 main (或 wmain)
WinMainCRTStartup (或 wWinMainCRTStartup) 使用/SUBSYSTEM 的应用程序:WINDOWS;调用 WinMain (或 wWinMain) ,必须将其定义为使用 __stdcall
_DllMainCRTStartup DLL; DllMain 如果它存在,则调用它,它必须定义为使用 __stdcall
如果未指定 /DLL 或 /SUBSYSTEM 选项,则链接器将根据是否定义了或来选择子系统和入口点 main WinMain 。
函数 main 、 WinMain 和 DllMain 是用户定义入口点的三个窗体。
创建托管图像时,指定给/ENTRY 的函数的签名必须是 (LPVOID var1、DWORD var2、LPVOID var3) 。

下面是一个空 的 WinMain 函数。

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR lpCmdLine, INT nCmdShow)
{
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值