c++ - 在 Windows 上加载 DLL 失败

标签 c++ dll

作为一名 Xcode 开发人员,我也必须在 Windows 上使用我编写的代码。我认为我已经成功掌握了所有跨平台问题,但现在我在理解 Windows 上的 DLL hell 方面遇到了真正的问题。 我成功地将我的代码与 Xcode 和 Gcc (Ubuntu) 一起使用。在 Windows 上,我收到一条错误消息:

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

我读了很多关于这个用途的资料,但我在理解这个问题时遇到了问题。 通常在 Windows 上我有类似

#define MYLIB_API __declspec(dllimport)

我在 Bass 库 (bass.h) 的 header 中找不到它。只有一行

#define BASSDEF(f) WINAPI f

现在,我尝试在我的代码中动态加载 DLL 函数。您可以在底部看到动态加载标题作为链接。在这里复制太多。这种动态加载适用于 .dylib 和 .so 库,不适用于 .dll 我的目标是使用额外的库动态加载 DLL 而不是静态的。

在我的代码中,我使用了 bass.h 和 bassdecode.h。在我的代码中,我称之为示例:

bool returnVar = _BASS_SetConfig(BASS_CONFIG_DEV_DEFAULT,1);

在这里我得到了调用约定消息。

我必须在头文件中做什么才能在 Windows 上成功导入 DLL 函数?

您可以在以下位置下载文件:header files to download

最佳答案

好的,对于所有遇到相同问题的人,解决方案是 Hans Passant 的回答。我无法将此答案标记为解决方案,因此我想给他声誉。

函数的原始类型定义:

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 的快速提示。

关于c++ - 在 Windows 上加载 DLL 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55508996/

相关文章:

c# - 如何在 C# 中使用 Crypt32.dll 以兼容单声道

c# - 是否可以将 'strip' 设为 .NET DLL?

c++ - pthread_cond_timedwait 立即返回 ETIMEDOUT

c++ - 没有卡尔曼滤波器的 BackgroundSubtractorGMG?

c++ - 为什么 setprecision( ) 在一个数字中给我两个单独的小数点?

c# - 通过 C++ dll 或 C++ exe 编写 C# GUI

c++ - 在 asp.net 中使用 c++ dll - 异常 :Could not load file or assembly

c++ - vs c++ dll - 标量删除析构函数

c++ - 如何以可读格式打印控制字符?

c++ - 为什么编译器将 float 的位数固定为6位?