2

我有一个导出函数的 64 位 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 位模式下,到达函数入口点但参数无效?我能做什么?

4

2 回答 2

2

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

声明方法static

于 2011-08-12T16:25:08.893 回答
0

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

于 2011-08-12T16:03:47.147 回答