C++ 调用API函数时出现ESP错误?

C++ 调用API函数时出现ESP错误?,c++,winapi,import,function,C++,Winapi,Import,Function,平台:win32,语言:c++ 当我调用我声明的导入函数时,会出现此错误: int LoadSongFromFile(int module); typedef int (CALLBACK* loadSongT)(LPCTSTR); //... HINSTANCE dllHandle = NULL; loadSongT loadSongPtr = NULL; dllHandle = LoadLibrary(L"miniFMOD.dll"); loadSongPtr = (loadSongT)

平台:win32,语言:c++

当我调用我声明的导入函数时,会出现此错误:

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");
运行时检查失败#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中是string,所以我在C++中假设它的LPCTSTR)并返回一个int值

有人能检查一下我做错了什么吗?

p.S.songHandle得到一个奇怪的负值-858993460

这就是我如何从C#调用该函数的方法:

第2页:使用*typedefint(u cdecl loadSongT)(char);*不返回错误,但songHandle显示为0


miniFMOD.dll是非托管库您需要确保在函数指针原型中指定正确的调用约定(“回调”可能是错误的选择)。

调用代码使用的调用约定与被调用函数的调用约定不匹配。看见您需要打开定义该函数的标题(应该与您尝试使用的库一起提供),查找约定并相应地更改函数指针的定义。

我认为其他人误解了这个问题。在我看来,minifmod.dll是一个本机库,它导出一个名为SongLoadFromFile的函数。调用此函数的现有代码是托管代码(C#),它使用DllImport调用本机DLL中的函数。从我通过几次谷歌搜索所能收集到的少量信息来看,似乎应该声明如下:

typedef int (__cdecl * SongLoadFromFileT)(const char*);
重要的是,它是cdecl调用约定,它采用ANSI字符串而不是Unicode字符串

顺便说一句,我觉得很奇怪,我在minifmod.dll上找不到任何东西,除了在俄罗斯网站上的一些论坛帖子和这个家伙提出的一些问题。我在minifmod上能找到的唯一“合法”信息是一个具有类似功能的小型静态库。我想知道minifmod.dll是否是静态库的某种商业化版本;至少这可以解释为什么没有太多关于它的公开文档


啊,我找到了,;它是minifmod()的一个Delph端口。

您能更详细地解释一下吗?这不一定是WINAPI,可能是任何东西。您需要查看库文档以找到要使用的约定。没有文档,但是了解C#函数的语法有帮助吗?直到现在才注意到“C#”。甚至不确定从托管DLL调用函数是否可以在不使用互操作的情况下工作。您是否搜索过如何从非托管代码调用托管代码?我帮不了你,只能说我们为了同样的目的向COM公开了C#library,并通过COM使用它。这不是我的意思。DLL是用C++编写的,但是我知道如何使用C语言:[DLimPurt(“MINIFMOD.DLL”)]公共静态外部INTING LoopLoFFISH文件(String Name);我没有dllusing的任何头文件或文档,cdecl不会返回任何错误,但songHandle显示为0您给我的示例没有触发任何错误,但songHandle仍然为0,这意味着文件不存在,或者调用函数时出错。是否传递ANSI字符串?您的示例代码不正确。此外,您没有转义反斜杠字符;路径应为“C:\\b.xm”。如果出现问题,Win32库通常会调用SetLastError(),不管发生了什么错误代码;您可以调用GetLastError()来查看它是否已设置。除此之外,我不是一个通灵者,没有文件我也帮不上什么忙。您可以始终尝试运行File Monitor以查看它实际试图访问的文件(如果有),或者如果您是Desilve.OMFG,则可以单步进入汇编代码,以避开反斜杠。我爱你,伙计!这就是它一直返回0的原因,因为它无法检索该文件,所以返回了反斜杠