__stdcall的问题

gorilla007 gorilla007 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
在WINBASE.H中,有如下定义
WINBASEAPI BOOL WINAPI DeviceIoControl (HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped);
但我自己写了一段代码后,鼠标悬停在代码中的DeviceIoControl函数上,发现调用的是却是int __cdecl DeviceIoControl
为什么不是__stdcall呢?如何才能是__stdcall呢?
另,我是在eVC上做的,eVC中没有Calling convention -->_stdcall选项。
WINDEF.H中相关的定义如下

#ifdef _MAC
#define CALLBACK PASCAL
#define WINAPI CDECL
#define WINAPIV CDECL
#define APIENTRY WINAPI
#define APIPRIVATE CDECL
#ifdef _68K_
#define PASCAL __pascal
#else
#define PASCAL
#endif
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
#else
#define CALLBACK
#define WINAPI
#define WINAPIV
#define APIENTRY WINAPI
#define APIPRIVATE
#define PASCAL pascal
#endif
...全文

相关推荐

关于函数调用方式__stdcall和__cdecl详解

下面小编就为大家带来一篇关于函数调用方式__stdcall和__cdecl详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

weixin_38739164

C/C++中__stdcall使用时机[可运行源码]

本文探讨了C/C++中__stdcall调用方式的使用时机及其与__cdecl的区别。__stdcall参数从右向左传递,由被调用函数清退堆栈,适用于COM组件和DLL,以确保与其他语言的兼容性。相比之下,__cdecl由调用函数清退堆栈,适用于可变参数函数如printf。文章还通过一个有趣的例子展示了调用方式对参数传递顺序的影响,进一步说明了理解调用规范的重要性。

hhh00

stdcall介绍

stdcall的用法详解,常见的调用约定有:stdcall,cdecl,fastcall,thiscall,naked call

xiaodan4334

__cdecl与__stdcall区别[项目代码]

本文详细介绍了C/C++中两种主要的函数调用约定__cdecl和__stdcall的区别与联系。__cdecl是C/C++默认的调用约定,参数从右至左入栈,由调用者清理堆栈,适用于可变参数函数,但生成的可执行文件较大。__stdcall是Win32 API的标准调用方式,参数同样从右至左入栈,但由被调用函数清理堆栈,必须在编译时确定参数个数,调用者需严格控制参数传递。两者在参数入栈顺序上相同,但在堆栈清理主体、参数个数要求和代码空间占用上有显著差异。此外,文章还简要介绍了其他调用约定如__fastcall、__thiscall和naked call的特点及适用场景,并讨论了跨平台调用和DLL导出时的注意事项。

ppp33

函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)

函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal) 关于函数的调用规则(调用约定),大多数时候是不需要了解的,但是如果需要跨语言的编程,比如VC写的dll要delphi调用,则需要了解。 microsoft的vc默认的是__cdecl方式,而windows API则是__stdcall,如果用vc开发dll给其他语言用,则应该指定__stdcall方式。堆栈由谁清除这个很重要,如果是要写汇编函数给C调用,一定要小心堆栈的清除工作,如果是__cdecl方式的函数,则函数本身(如果不用汇编写)则不需要关心保存参数的堆栈的清除,但是如果是__stdcall的规则,一定要在函数退出(ret)前恢复堆栈。

zeroZhou0
评论 4
收藏 已收藏
分享
返回顶部
gorilla007
VC/MFC 16,550 成员 421,606 内容