Ошибка загрузки DLL в Windows - PullRequest
0 голосов
/ 04 апреля 2019

Как разработчик Xcode, я также должен использовать свой написанный код на Windows.Я думаю, что я успешно справился со всеми кросс-платформенными проблемами, но теперь у меня есть реальная проблема с пониманием ада DLL в Windows.Я использовал свой код с Xcode и Gcc (Ubuntu) успешно.В Windows появляется сообщение об ошибке:

Ошибка проверки времени выполнения # 0 - значение ESP не было должным образом сохранено при вызове функции.Обычно это является результатом вызова функции, объявленной с одним соглашением о вызовах, с указателем функции, объявленным с другим соглашением о вызовах.

Я много читал об этом использовании, но у меня есть проблемы, чтобы понять проблему.Обычно в Windows у меня есть что-то вроде

#define MYLIB_API __declspec(dllimport)

. Я не могу найти это в заголовке Bass Library (bass.h).Есть только одна строка

#define BASSDEF(f) WINAPI f

Теперь я пытаюсь динамически загружать функции DLL в моем коде.Вы можете увидеть динамический заголовок загрузки как ссылку внизу.Чтобы много копировать здесь.Эта динамическая загрузка работает для .dylib и .so libs хорошо, а не для .dll. Моя цель состоит в том, чтобы загружать динамическую, а не статическую DLL с дополнительной библиотекой.

В моем коде я использую bass.h иbassdecode.h.В моем коде я вызываю как образец:

bool returnVar = _BASS_SetConfig(BASS_CONFIG_DEV_DEFAULT,1);

И здесь я получаю сообщение соглашения о вызовах.

Что мне нужно сделать в моем заголовочном файле для успешного импорта функций DLL в Windows?

Вы можете скачать файлы по адресу: заголовочные файлы для загрузки

1 Ответ

2 голосов
/ 04 апреля 2019

Хорошо, для всех, кто сталкивается с той же проблемой, решение - это ответ Ханса Пассанта. Я не могу пометить этот ответ как решение, поэтому хочу дать ему репутацию.

Мой оригинальный typedef функции:

typedef BOOL    (*BASS_SetConfig_Type)(DWORD option, DWORD value);

был найден в DLL

_BASS_SetConfig = (BASS_SetConfig_Type)DllFindSym(m_hMod, "BASS_SetConfig")

Где DLLFindSym определяется как:

#define DllFindSym(handle,name) (GetProcAddress(handle,name))   

Теперь изменил typedef на

typedef BOOL    (__stdcall *BASS_SetConfig_Type)(DWORD option, DWORD value);

Теперь все работает как чудо в Windows. Большое спасибо за подсказку Ганса Пассанта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...