2008-10-17 45 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