Неразрешенные внешние компоненты в C ++: сигнатура метода искажения Visual C ++ отличается от сигнатуры метода искажения в dll

Я использую Visual Studio 2012 под управлением C ++ для создания моста между сторонним SDK и нашей системой, написанной на C #. Я успешно завернул и использовал несколько функций из указанного SDK. За исключением одного, которое приводит только к неразрешенной внешней ошибке.

Заголовочный файл SDK определяет сигнатуру функции:

#if defined WIN32
#if defined BUILD_ADS_SHARED_LIB
#define ADS_LINK_SPEC __declspec (dllexport)
#define ADS_CALLING_CONVENTION __stdcall
#elif defined USE_ADS_SHARED_LIB
#define ADS_LINK_SPEC __declspec (dllimport)
#define ADS_CALLING_CONVENTION __stdcall
#else
#define ADS_LINK_SPEC
#define ADS_CALLING_CONVENTION
#endif
#else
#define ADS_LINK_SPEC
#define ADS_CALLING_CONVENTION
#endif

DatabaseResult ADS_LINK_SPEC ADS_CALLING_CONVENTION
createDatabase(
const Settings& settings, Artec::SdkDatabase::iDatabase *& instance);

Ошибка говорит:

Error   10  error LNK2028: unresolved token (0A000089) "enum Artec::SdkDatabase::DatabaseResult __cdecl Artec::SdkDatabase::createDatabase(class Artec::SdkDatabase::Settings const &,class Artec::SdkDatabase::iDatabase * &)" (?createDatabase@SdkDatabase@Artec@@$$FYA?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z) referenced in function "private: static enum Artec::SdkDatabase::DatabaseResult __clrcall Broadway3dWrapper::Broadway3dWrapper::GetConn(wchar_t const *,wchar_t const *,wchar_t const *,wchar_t const *,char const *,class Artec::SdkDatabase::iDatabase * &)" (?GetConn@Broadway3dWrapper@1@$$FCM?AW4DatabaseResult@SdkDatabase@Artec@@PB_W000PBDAAPAViDatabase@34@@Z) C:\bioap\tfs\Identitum\Dev\src\BA.Identitum.Devices.Broadway3d\Broadway3dWrapper.obj    BA.Identitum.Devices.Brodway3D

Так что он ищет искалеченное имя:

?createDatabase@SdkDatabase@Artec@@$$FYA?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z

Делая небольшую мусорную корзину на dll, на которую ссылаются, я обнаружил, что на самом деле есть функция, которая называется экспортируемой, вещь в том, что имя искажено немного по-другому:

?createDatabase@SdkDatabase@Artec@@YG?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z

Может ли кто-нибудь помочь мне здесь? Я не могу связаться с поставщиком SDK, и я полностью потерян здесь.

0

Решение

Разница между этими двумя заключается в разделе соглашения о вызовах.

createDatabase@SdkDatabase@Artec@@YG?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z это стандартный вызов: enum Artec::SdkDatabase::DatabaseResult __stdcall Artec::SdkDatabase::createDatabase(class Artec::SdkDatabase::Settings const &,class Artec::SdkDatabase::iDatabase * &)

Деманглер я использовал не понимает ?createDatabase@SdkDatabase@Artec@@$$FYA?AW4DatabaseResult@12@ABVSettings@12@AAPAViDatabase@12@@Z, но та часть, где они отличаются (@@$$FYA? против @@YG?) это соглашение о вызовах (если я изменю YG в YF, соглашение о вызовах меняется и больше ничего не меняется).

Измените ваше объявление функции на return-type __stdcall function-name[(argument-list)],

Когда вы включили заголовочный файл, вы сделали #define USE_ADS_SHARED_LIB явно или в командной строке компилятора? Вы ориентируетесь на 32-битные окна?

5

Другие решения

Используйте утилиту undname.exe для удаления имен. Он ищет:

enum Artec::SdkDatabase::DatabaseResult
__cdecl
Artec::SdkDatabase::createDatabase(
class Artec::SdkDatabase::Settings const &,
class Artec::SdkDatabase::iDatabase * &
)

Тот, который вы нашли:

enum Artec::SdkDatabase::DatabaseResult
__stdcall
Artec::SdkDatabase::createDatabase(
class Artec::SdkDatabase::Settings const &,
class Artec::SdkDatabase::iDatabase * &
)

Все соответствует, кроме соглашения о вызовах, __cdecl vs __stdcall. Обратите внимание, как заголовок SDK позволяет этому происходить, он не вызывает вонь, когда ни BUILD_ADS_SHARED_LIB, ни USE_ADS_SHARED_LIB не определены #. И это создаст функцию __cdecl. Плохая идея, кстати.

Настолько высокие шансы, что вы просто забыли определить USE_ADS_SHARED_LIB. Project + Properties, C / C ++, препроцессор, настройка определений препроцессора.

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector