Delphi调用ucrtbase.dll的_wputenv_s应选cdecl还是stdcall?
调用约定选择结论
应当选择cdecl作为该函数的调用约定,具体原因如下:
_wputenv_s是ucrtbase.dll即微软通用C运行库提供的标准C接口,C语言函数的原生默认调用约定就是cdecl,完全匹配官方的函数定义,属于合规写法。- 目前两种调用约定都能正常运行属于巧合,不代表stdcall是正确选择:
- 32位运行环境下:该函数只有2个指针类型参数,栈参数总长度固定,
cdecl(调用方清理栈)和stdcall(被调用方清理栈)的栈处理逻辑差异刚好没有触发栈不平衡崩溃,属于偶发可用,不是正确实现。 - 64位Windows运行环境下:微软统一了系统级调用约定,函数声明中写的
cdecl、stdcall都会被编译器自动忽略,统一使用x64默认调用约定,所以两种写法运行效果完全一致,不代表stdcall符合规范。
- 32位运行环境下:该函数只有2个指针类型参数,栈参数总长度固定,
- 如果随意使用不符合官方定义的stdcall约定,后续调用其他参数数量、类型不同的C运行库函数时,极大概率会出现栈不平衡导致的程序崩溃、返回值异常等难以排查的问题。
正确的函数声明参考:
function _wputenv_s(varname: PChar; value_string: PChar): integer; cdecl; external 'ucrtbase.dll' delayed;
内容的提问来源于stack exchange,提问作者zeus
相关产品推荐
相关产品推荐

