我调用API函数时ESP错误?

时间:2009-12-19 16:05:13

标签: c++ winapi import function

平台: 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#中它是字符串,所以我假设它在C ++中使用LPCTSTR)并返回一个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 个答案:

答案 0 :(得分:3)

您需要确保在函数指针原型中指定正确的调用约定('CALLBACK'可能是错误的选择)。

答案 1 :(得分:3)

我认为其他人误解了这个问题。在我看来,minifmod.dll是一个导出名为SongLoadFromFile的函数的本机库。调用此代码的现有代码是使用DllImport调用本机DLL中的函数的托管代码(C#)。通过一些Google搜索我可以收集的信息很少,看起来应该声明如下:

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

重要的是,它是__cdecl调用约定,它采用ANSI字符串而不是Unicode字符串。

顺便说一句,我发现奇怪的是,除了俄罗斯网站上的一些论坛帖子以及来自这个人的一些SO问题之外,我找不到任何关于minifmod.dll的内容。我在minifmod上找到的唯一“合法”信息是一个具有类似功能的小型静态库。我想知道minifmod.dll是否是静态库的某种商业化版本;至少这可以解释为什么没有太多关于它的公开文件。

啊,我找到了;它是minifmod的Delph端口(http://www.cobans.net/minifmod.php)。

答案 2 :(得分:2)

调用代码使用的调用约定与被调用函数的调用约定不匹配。见this very similar question。您需要打开定义该函数的头文件(应该使用您尝试使用的库),查看约定并相应地更改函数指针声明。