Я пытаюсь связать DLL, но у меня постоянно возникают проблемы с UINT32
,
Библиотека скомпилирована для версии 4.1 компилятора Visual Studio. Интерфейс для моего компонента (который был 4.1, и я теперь портирую на 2012) определяется многими UINT32
в этом. В VC4.1 UINT32
не определено компилятором и поэтому было определено unsigned long
программистом, но начиная с VC6 UINT32
определяется как unsigned int
, Это делает мою жизнь трудной.
Моя первоначальная реакция была попытка заменить все UINT32
в интерфейсе с unsigned long
и перекомпиляция. Это работает, так как сигнатуры функций одинаковы. Однако unsigned long
в 2012 году ширина 64 бита … не 32 бита. В большинстве случаев это не проблема, но я предвижу возможные проблемы с параметрами флагов и типами возвращаемых данных.
Что мне интересно, так это то, что я упустил более очевидное решение для этого. Я думал об определении другого типа
typedef OAM_UINT32 unsigned long //in the library
typedef OAM_UINT32 unsigned int // in my component
Но тогда проблема будет такой же, как у меня с моими двумя определениями UINT32 … верно?
Любая помощь приветствуется.
Эта проблема
Код клиента
#include <oam_if.h>
....
UINT32 uuid = getSomeLocalUserId();
UINT32 dwOamRetVal = dwOamGetUserDetails( uuid ); // LINK ERROR: Symbol not found
oam_if.h
UINT32 dwOamGetUserDetails( UINT32 idOfUser );
Когда библиотека (OAM) скомпилирована, значение UINT32 оценивается как unsigned long
, Когда клиентский компонент компилируется, UINT32 оценивается как unsigned int
, Компоновщик жалуется, потому что у него есть символ, определенный в библиотеке OAM для dwOamGetuserDetails
который сгребает и возвращает unsigned long
, но клиент вызывает функцию, которая в соответствии с этим должна принимать unsigned int
,
Таким образом, в то время как их соответствующие входы имеют числа без знака длиной 32 бита, сигнатура функции отличается, и компоновщик жалуется.
Единственный способ, которым я могу это исправить — определить все как unsigned long
непосредственно. Однако тогда OAM будет использовать 32-битное число, а клиент будет использовать 64-битное число!
Образец ошибки компоновщика
ошибка LNK2001: неразрешенный внешний символ «public: virtual unsigned long __thiscall Message :: getCallId (void) const» (? getCallId @ Message @@ UBEKXZ) oam.lib (OAM_SsRequest.obj)
На самом деле это обратный вызов из библиотеки в компонент, поэтому в этом случае он ищет сигнатуру, соответствующую UINT32, как определено библиотекой (unsigned long), но компонент определяет unsigned int для своего обратного вызова.
Задача ещё не решена.
Других решений пока нет …