2008-10-17 42 views
4

在XP 32位这条线与不问题编译然而在Vista中的64位这一行:stdcall over-ride by visual studio?

m_FuncAddr = ::GetProcAddress (somthing); 

提供了以下错误

错误C2440: '=':不能从 'FARPROC' 转换'INT(__cdecl *)(无效)'

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语句?

在此先感谢!

[编辑]

要clerfiy问题:

在等式的一侧(说侧1)我有

int __stdcall * m_FuncAddr 

在另一侧(侧2)

INT_PTR far __stdcall GetProcAddress 

那么,如果两个都是stdcalls,那么我怎么才能用cdecl来抛出第二面呢? 或者我没有得到什么?

+0

我的回答依然矗立你的编辑,诠释后INT_PTR在64位建立很大的不同! – 2008-10-17 01:53:19

+0

如果您只查看“回复”标签,请参阅下面的编辑。 – 2008-10-21 01:04:11

回答

3

返回类型应该是INT_PTR(64位版本中的一个64位值)。你不应该绕过这个错误 - 编译器试图告诉你一些错误。

来自WinDef。H:

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

所以m_FuncAddr的声明应该是:

INT_PTR (WINAPI *m_FuncAddr)(); 
2

这是一个巧合,它在32位编译正确;正确的语法是:

typedef int (WINAPI *FFuncType)(); 
FFuncType m_FuncAddr; 
m_FuncAddr = (FFuncType)::GetProcAddress (somthing); 

您需要明确地将:: GetProcAddress的结果转换为正确的函数签名。在32bit中,FARPROC恰好符合您的签名,但可能不在64位。

编辑:是的,事实上,看着windef.h,返回类型是64位的INT_PTR,所以这就是为什么你得到编译器错误。不过,您仍然需要对上述函数签名进行强制转换,以避免出现与FARPROC的占位符不匹配的任何函数,因此您应该按照上述方法进行操作。

+0

但是,FFuncType是stdcall,我将它转换为cdecl,或者我没有收到任何东西? – 2008-10-17 01:41:04