【问题标题】:Loading DLL fails on Windows在 Windows 上加载 DLL 失败
【发布时间】:2019-04-07 18:20:08
【问题描述】:

作为一名 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。

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

bool returnVar = _BASS_SetConfig(BASS_CONFIG_DEV_DEFAULT,1);

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

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

您可以在以下地址下载文件:header files to download

【问题讨论】:

  • 请贴出错误信息
  • 我已将黄色部分的消息改为Windows的原始消息文本
  • 这是一个非常普通的 MSVC++ 运行时错误,函数的声明与实际定义不符。没有正确声明函数指针很容易出错。很可能是缺少__stdcall,我们看不到。
  • 正如我所写的,我已将两个头文件、my 和 bass lib 添加到帖子中。据我了解,DLL 是否必须具有 EXPORT。在我的头文件中,我使用了他的功能,我需要一个 IMPORT。但是在bass头文件中没有EXPORT,只是一个WINAPI的东西。所以我很困惑我必须在头文件中做什么才能很好地导入 DLL 函数。

标签: c++ dll


【解决方案1】:

好的,对于所有遇到相同问题的人,解决方案是 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 的快速提示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2012-12-21
    相关资源
    最近更新 更多