LoadLibraryEx: параметры теряются в 64-битной - PullRequest
2 голосов
/ 12 августа 2011

У меня есть 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-битном режиме точка входа в функцию достигнута, но параметры недействительны?Что я мог сделать?

Ответы [ 2 ]

2 голосов
/ 12 августа 2011

Вы объявили это как статическую функцию, но велики шансы, что это на самом деле метод экземпляра.Он работает случайно на x86, потому что указатель this передается в регистре, а не в стеке.Вам не повезло на x64, потому что он передает аргументы другим способом.Все передается в регистрах, теперь вызывающий и вызываемый больше не совпадают.В противном случае компоновщик не сможет помочь вам диагностировать эту проблему во время сборки, поскольку вы использовали GetProcAddress.

Объявите метод static .

0 голосов
/ 12 августа 2011

В x64 нет такой вещи, как __cdecl соглашение, см. this , вам нужно правильно выполнить ветвление для сборок x86-32 и x86-64 (также, кажется, у вас есть некоторые специфичные для компилятора расширения там как :function). Я подозреваю, что dll, который вы вызываете, не был правильно скомпилирован для x64 (отладчик даст вам более точный ответ).

...