Несовпадение версии компилятора UINT32 — Ссылка на устаревшую библиотеку

Я пытаюсь связать 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 для своего обратного вызова.

1

Решение

Задача ещё не решена.

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

Других решений пока нет …

По вопросам рекламы [email protected]