Ошибка ESP при вызове функции API? - PullRequest
0 голосов
/ 19 декабря 2009

платформа: win32 , язык: c ++

Я получаю эту ошибку при вызове импортированной функции, которую я объявил:

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

И вот код, который я использовал:

int LoadSongFromFile(int module);
typedef int (CALLBACK* loadSongT)(LPCTSTR);

//...

HINSTANCE dllHandle = NULL;
loadSongT loadSongPtr = NULL;

dllHandle = LoadLibrary(L"miniFMOD.dll");
loadSongPtr = (loadSongT)GetProcAddress(dllHandle,"SongLoadFromFile");

int songHandle = loadSongPtr(L"C:\b.xm");

Я пытаюсь вызвать функцию SongLoadFromFile , которая требует один аргумент (в C # это строка, поэтому я предполагаю, что ее LPCTSTR в C ++) и возвращает значение int.

Может кто-нибудь проверить, что я сделал не так?

P.S. songHandle получает странное отрицательное значение -858993460

Вот как я могу вызвать эту функцию из C #:

[DllImport("MiniFMOD.dll")] public static extern int SongLoadFromFile(string name);

P.S. 2: Использование * typedef int (__cdecl loadSongT) (char ); * не возвращает ошибку, но songHandle отображается как 0.

miniFMOD.dll - неуправляемая библиотека

Ответы [ 3 ]

3 голосов
/ 19 декабря 2009

Я думаю, что другие люди неправильно понимают вопрос. Мне кажется, что minifmod.dll является нативной библиотекой, которая экспортирует функцию с именем SongLoadFromFile. Существующий код, который вызывает это, является управляемым кодом (C #), который использует DllImport для вызова функции в собственной DLL. Из того небольшого количества информации, которое я мог собрать с помощью нескольких поисков в Google, выглядит так, как будто это должно быть объявлено следующим образом:

typedef int (__cdecl * SongLoadFromFileT)(const char*);

Важно, что это __cdecl соглашение о вызовах, и оно принимает строку ANSI вместо строки Unicode.

Кроме того, я нахожу странным, что я не могу найти НИЧЕГО на minifmod.dll, кроме нескольких сообщений на форуме на русском сайте и некоторых ТАК вопросов от этого парня. Единственная «законная» информация, которую я могу найти в minifmod, - это небольшая статическая библиотека со схожей функциональностью. Интересно, является ли minifmod.dll коммерческой версией статической библиотеки; по крайней мере, это объясняет, почему об этом не так много публичной документации.

Ах, я нашел это; это Delph порт minifmod (http://www.cobans.net/minifmod.php).

3 голосов
/ 19 декабря 2009

Необходимо убедиться, что в прототипе указателя на функцию указано правильное соглашение о вызовах («CALLBACK» может быть неправильным выбором).

2 голосов
/ 19 декабря 2009

Код вызова использует соглашение о вызовах, не соответствующее соглашению вызываемой функции. См. этот очень похожий вопрос . Вам нужно открыть заголовок, определяющий эту функцию (должен поставляться с библиотекой, которую вы пытаетесь использовать), посмотреть соглашение и соответственно изменить объявление указателя на функцию.

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