LoadLibraryEx:参数在64位中丢失

时间:2011-08-12 15:38:33

标签: c++ 64-bit dllexport

我有一个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位模式下达到了函数入口点,但参数无效?我该怎么办?

2 个答案:

答案 0 :(得分:2)

您将其声明为静态函数,但它实际上是实例方法的可能性很大。它在x86上偶然工作,因为 this 指针在寄存器中而不是在堆栈中传递。你在x64上运气不好,因为它以不同的方式传递参数。一切都在寄存器中传递,现在调用者和被调用者不再匹配。由于您使用了GetProcAddress,链接器无法在构建时帮助您诊断此问题。

声明方法 static

答案 1 :(得分:0)

在x64中没有__cdecl约定,请参阅this,你需要为x86-32和x86-64版本正确分支(似乎你也有一些特定的编译器)那里的扩展名如:function)。我怀疑你调用的dll没有正确编译为x64(调试器会给你一个更确定的答案)。