作为Xcode开发人员,我也必须在Windows上使用编写的代码。我认为我已经成功地掌握了所有跨平台问题,但是现在我在理解Windows上的DLL地狱时遇到了一个真正的问题。 我将代码成功用于Xcode和Gcc(Ubuntu)。在Windows上,我收到一条错误消息:
运行时检查失败#0-在整个函数调用中ESP的值未正确保存。这通常是由于使用一种调用约定声明的函数和使用另一种调用约定声明的函数指针进行调用的结果。
我了解了很多有关此用途的信息,但是我有一些问题需要理解。 通常在Windows上,我会像
#define MYLIB_API __declspec(dllimport)
在Bass库(bass.h)的标头中找不到此文件。只有一行
#define BASSDEF(f) WINAPI f
现在,我尝试在代码中动态加载DLL函数。您可以在底部的链接中看到动态加载标题。要复制很多。这种动态加载适用于.dylib和.so库,不适用于.dll 我的目标是通过一个附加的库来动态加载DLL而不是静态加载DLL。
在我的代码中,我使用了bass.h和bassdecode.h。在我的代码中,我称之为示例:
bool returnVar = _BASS_SetConfig(BASS_CONFIG_DEV_DEFAULT,1);
在这里,我得到呼叫约定消息。
要在Windows上成功导入DLL函数,我必须在头文件中做什么?
您可以在以下位置下载文件:header files to download
答案 0 :(得分:2)
好吧,对于所有遇到相同问题的人,解决方案就是Hans Passant的答案。我无法将此答案标记为解决方案,因此我想给他以声誉。
我对函数的原始typedef:
typedef BOOL (*BASS_SetConfig_Type)(DWORD option, DWORD value);
是在DLL中搜索的
_BASS_SetConfig = (BASS_SetConfig_Type)DllFindSym(m_hMod, "BASS_SetConfig")
其中DLLFindSym定义为:
#define DllFindSym(handle,name) (GetProcAddress(handle,name))
现在将typedef更改为
typedef BOOL (__stdcall *BASS_SetConfig_Type)(DWORD option, DWORD value);
现在,一切在Windows中都像魅力一样。非常感谢Hans Passant的快速提示。