我有一个64bit-DLL导出函数
__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位模式下达到了函数入口点,但参数无效?我该怎么办?
答案 0 :(得分:2)
您将其声明为静态函数,但它实际上是实例方法的可能性很大。它在x86上偶然工作,因为 this 指针在寄存器中而不是在堆栈中传递。你在x64上运气不好,因为它以不同的方式传递参数。一切都在寄存器中传递,现在调用者和被调用者不再匹配。由于您使用了GetProcAddress,链接器无法在构建时帮助您诊断此问题。
声明方法 static 。
答案 1 :(得分:0)
在x64中没有__cdecl
约定,请参阅this,你需要为x86-32和x86-64版本正确分支(似乎你也有一些特定的编译器)那里的扩展名如:function
)。我怀疑你调用的dll没有正确编译为x64(调试器会给你一个更确定的答案)。