2011-08-12 25 views
2

我有一個64位的DLL其中出口功能LoadLibraryEx:參數迷失在64位

__cdecl int (*function)(IN wchar_t* file, OUT VARIANT &htmlFile, IN wchar_t* path); 

其作爲

int CShellWrapperx64Module:function(wchar_t* file, VARIANT &htmlFile, wchar_t* path) { 
    VariantInit(&htmlFile); 
    htmlFile.vt = VT_BSTR; 
    htmlFile.bstrVal = ::SysAllocString(L""); 
    return 0; 
} 

實現和64位的DLL它調用函數

function pfunction = (function)GetProcAddress(hMod, MAKEINTRESOURCEA(0x0001)); 
TCHAR m_file[MAX_PATH]; 
VARIANT vhtml; 
VariantInit(&vhtml); 
pfunction(m_file, vhtml, path); 

在32位模式下函數調用成功,但在64位模式下達到函數入口點,但參數ar e無效?我能做什麼?

+0

如果'LoadLibraryEx'不在你的代碼示例中,並且你說'GetProcAddress'調用成功了,那究竟是什麼? – Necrolis

+0

可能與x64沒有__cdecl這一事實有關? – hamstergene

回答

0

在64位有沒有這樣的事情作爲__cdecl約定,請參見this,你需要正確的分岔的x86-32和x86-64構建(也似乎你有一些編譯器特定的擴展在那裏,像:function)。我懷疑你調用的dll沒有正確編譯爲x64(調試器會給你一個更明確的答案)。

2

你將它聲明爲一個靜態函數,但它實際上是一個實例方法的可能性很大。它在x86上偶然運行,因爲這個指針被傳入一個寄存器,而不是在堆棧中。你在x64上運氣不佳,因爲它以不同的方式傳遞參數。一切都在寄存器中傳遞,現在主叫方和被叫方不再匹配。否則連接器無法幫助您在構建時診斷此問題,因爲您使用了GetProcAddress。

聲明方法靜態