#c #dll #calling-convention #loadlibrary #getprocaddress
#c #dll #соглашение о вызове #loadlibrary #получитьprocaddress
Вопрос:
Я использую Visual Studio 2019 с C .
Я пытаюсь загрузить 32-разрядную DLL, написанную в коде C (не мной), в мое приложение на C . DLL — это то, что называется SDL_mixer.dll (его ранняя версия, SDL_mixer-1.2.12, которая является обязательной). Я должен загрузить его через LoadLibrary(), потому что у меня нет библиотеки импорта. Я ввел функции для импорта и использовал GetProcAddress() для доступа к одной из них. Он обращается к ней, но затем выдает ошибку при вызове функции. Это дает представление о причине проблемы.
В нем говорится:
«Значение ESP не было сохранено должным образом при вызове функции. Обычно это результат вызова функции, объявленной с одним соглашением о вызове, с указателем на функцию, объявленным с другим соглашением о вызове «
Я не уверен, какую ошибку я совершаю. Иногда я успешно вызывал C DLL из приложения на C , используя метод LoadLibrary.
Вот код, который у меня есть:
typedef int (WINAPI* Mix_OpenAudioA)(int frequency, Uint16 format, int channel, int chunksize);
int main()
{
const HINSTANCE hLibrary = LoadLibrary(L"SDL_mixer.dll");
if (hLibrary == NULL) {
cout << "Unable to open SDL_mixer.dlln";
return 0;
}
Mix_OpenAudioA mx_OpnAudio = (Mix_OpenAudioA)GetProcAddress(hLibrary, "Mix_OpenAudio");
// Calling this function is where the error occurs
if (mx_OpnAudio(44100, AUDIO_S16, 2, 512) < 0) {
cout << "Audio Initializer Errorn";
return 0;
}
}
Спасибо за любую помощь!
…Джон
Комментарии:
1. Вы вызываете 32-разрядную dll из 64-разрядной программы.
2. Проверьте соглашение о вызове здесь
3. Я не вижу в исходном коде SDL намека на то, что вам следует использовать WINAPI (он же
__stdcall
). И это не та библиотека, которая бы этому способствовала. Поэтому удалите его и повторите попытку.4. @Mike Vine — Нет, это 32-разрядное приложение.
5. @Hans Passant — Спасибо! Это было все. Мне еще многое предстоит узнать об этих соглашениях о вызовах.