WinAPI WinMain, CreateMutex, ShellExecute三个函数
2021-05-12 13:28
标签:ret 编译 fast 不同 api函数 函数参数 pre bcb lin WinMain函数是提供给用户的Windows应用程序入口点,其原型如下: 函数有四个参数: hInstancd: 是当前应用长须实例的Handle。 hPrevInstance: 是应用程序上一个实例的Handle。(MSDN:如果你想要知道程序是否有另一个实例,建议使用Mutex来实现,用Mutex可以实现只运行一个实例) ipCmdLine: 字符串,是命令行参数。 nCmdShow: int型,指明windows应该怎么实现,windows定义了一系列的宏来帮助记忆,以SW开头,如:SW_SHOW。 返回值是一个int型。 如果函数运行成功的话,它会一直运行,知道接收到WM_QUIT消息,它应该返回消息的wParam参数的退出值。如果函数进入消息循环前退出,它应该返回0。 WINAPI 是一个宏定义: __stdcall和__cdecl, __pascal, __fastcall都是一些类似的关键字,详细信息如下: 1.它们实际上是关于堆栈的一些说明,包括函数参数压栈顺序和压入堆栈的内容由谁来清除(是调用者还是自己)。而上述这些关键字用来告诉编译器产生什么样的汇编代码。 2.VC由两种函数的调用方式:__stdcall和__cdecl 前者指的是PASCAL调用方式,后者指的时C调用方式。使用PASCAL调用方式,函数在返回到调用者之间将参数从栈中删除;使用C调用方式,参数的删除是调用者完成的。 WinMain函数由系统调用,windows系统规定由系统调用的函数都要遵循PASCAL调用方式,但是VC中函数的缺省调用方式是C调用方式,所以要在WinMain前显式声明WINAPI。在Windows编程中将会遇到很多类似的声明,如:CALLBACK, WINAPI, PASCAL这些在Intel CPU的计算机上都是__stdcall。 3.__cdecl是C/C++和MFC程序默认使用的调用方式,也可以在函数声明时加上__cdecl关键字来手动指定。采用__cdecl调用方式时,函数的参数按照从右到左的顺序入栈,并且由函数调用者把参数弹出栈以清理堆栈,因此,实现可变参数的函数只能使用该调用方式,由于每一个使用__cdecl调用方式的函数都要包含清理堆栈的代码,所以产生的可执行文件的大小会比较大;__stdcall调用方式用于调用win32 API函数,采用__stdcal调用方式时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,函数参数个数固定,由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条ret n指令直接清理传递参数的堆栈;__fastcall调用方式用于对性能要求非常高,__fastcall调用方式将函数的从左边开始的两个大小不大于4个字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的堆栈。 thiscall仅仅用于"C++"成员函数。this指针存放在CX/ECX寄存器中,参数从右到左压。thiscall不是关键字,因此不能被程序员指定。 nakedcall。当采用其他调用方式时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。 特别说明: 1.在默认情况下,采用__cdecl方式,因此可以省略。 2.WINAPI一般用于修饰动态链接库中导出的函数。 3.CALLBACK仅用于修饰回调函数。 4.你可能已经发现,VC下和BCB下对WINAPI的定义不同,那么你至少理解为什么不能直接从BCB下调用VC的DLL的一个原因了。 总体来说,VC默认的是__cdecl方式,Win32 API函数是用__stdcall方式的,他们都是将函数的参数从右到左入栈的,__cdecl方式的每个函数都有清理堆栈的代码,可以实现可变参数列表,但可执行文件比较大。__stdcall方式是调用方式是调用者清理堆栈的。__fastcall的特点是他讲参数左边的两个参数放在寄存器上,比较快。其余参数还是在堆栈中,堆栈还是由函数自己清理。 WinAPI WinMain, CreateMutex, ShellExecute三个函数 标签:ret 编译 fast 不同 api函数 函数参数 pre bcb lin 原文地址:http://www.cnblogs.com/shucome/p/7572142.htmlint WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR ipCmdLine, int nCmdShow);
#define WINAPI __stdcall
上一篇:窗体控件应用总结(1)
下一篇:c#唯一订单号生成代码
文章标题:WinAPI WinMain, CreateMutex, ShellExecute三个函数
文章链接:http://soscw.com/index.php/essay/84703.html