c++ - stdcall 被 visual studio 覆盖了吗?

标签 c++ c windows visual-studio 64-bit

在 xp 32 位中,这一行编译没有问题,但是在 vista 64 位中,这一行:

m_FuncAddr = ::GetProcAddress (somthing);

出现以下错误

error C2440: '=' : cannot convert from 'FARPROC' to 'int (__cdecl *)(void)'

GetProcAddress 定义为

WINBASEAPI FARPROC WINAPI GetProcAddress (somthing)

和 m_FuncAddr 一样

int (WINAPI *m_FuncAddr)();

据我了解,两者都是 stdcall 的。

为了避免我不得不提出的错误

m_FuncAddr = (int (__cdecl *)(void))::GetProcAddress(somthing);

我的问题:

如果 m_FuncAddr 和 GetProcAddress 都具有 stdcall 调用约定,为什么我必须使用 cdecl 来“调用”它?

是否有可能是 VS 项目设置“默认调用约定”(设置为 cdecl)覆盖了上面的 assignemet 语句?

提前致谢!

[编辑]

为了澄清问题:

在等式的一边(比如边 1)我有

int __stdcall * m_FuncAddr

另一边(边2)

INT_PTR far __stdcall GetProcAddress

如果两者都是 stdcalls,我怎么必须用 cdecl 转换 side 2 呢? 或者我没有得到什么?

最佳答案

返回类型应为 INT_PTR(64 位构建中的 64 位值)。你不应该绕过这个错误——编译器试图告诉你出了什么问题。

来自 WinDef.h:

#ifdef _WIN64
typedef INT_PTR (FAR WINAPI *FARPROC)();

所以m_FuncAddr的声明应该是:

INT_PTR (WINAPI *m_FuncAddr)();

关于c++ - stdcall 被 visual studio 覆盖了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/210836/

相关文章:

c - 现代 x64 系统上的指针内部是什么?

c++ - 使用 Windows 7 集成编写命名空间扩展

c++ - 在不使用内核的情况下写入 CUDA 中的共享内存

c# - 托管代码和非托管代码之间的调用

c++ - 未定义的行为怪癖 : reading outside a buffer causes a loop to never terminate?

c - 将内存分配给指向函数的指针数组

c - 如何正确地将值输入到矩阵中?

C二叉查找树删除实现

c++ - 为什么必须将参数强制转换为 const?

c++ - Exe 不是有效的 win32 应用程序,但在 64 位上运行