Загрузка библиотеки DLL C с помощью LoadLibrary в приложение на C , вызывая ошибки соглашения

#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 — Спасибо! Это было все. Мне еще многое предстоит узнать об этих соглашениях о вызовах.