【问题标题】:Renaming dll import functions重命名 dll 导入函数
【发布时间】:2021-11-13 04:58:33
【问题描述】:

有没有办法为我从 dll 导入的函数使用另一个名称? 假设我有一个用 C 编写的函数,它被导出到一个 DLL:

__declspec(dllexport) int Sum(int x, int y);

我想将它导入到命名空间 Math 下的 C++ 项目中,并命名为 Add 而不是 Sum:

namespace Math {
  __declspec(dllimport) int Add(int x, int y);
}

现在我知道这不会链接,那么有没有可能的方法呢?

【问题讨论】:

  • 为什么?这可能是所谓的“XY 问题”,这意味着您问错了问题。
  • 使用 LoadLibrary GetProcAddress 组合手动加载它(不要使用导入库),您可以随意调用它。
  • 如果您可以使用 .DEF 文件,您可以更改导出的名称,尽管我认为您需要使用管理名称。请参阅EXPORTS 部分的文档。
  • 可能duplicate
  • @1201ProgramAlarm 我在想一种通用的方法,它适用于语言本身,而不是 gcc(我使用 msvc)。类似于 C# 中的 [DLLimport("Library.dll", entryPoint="Sum")]

标签: c++ c dll


【解决方案1】:

你可以写一个简单的包装器:

// header file
namespace Math {
    int Add(int, int);
}

// implementation file
#include "c-library-header.h"
int Math::Add(int x, int y) {
    return Sum(x, y);
}

为了避免在暴露的代码中包含 C 头文件,我已将其拆分为两个文件,即为了更清晰地分隔界面的任一侧。如果您不关心这一点,您也可以只使用一个 inline 包装函数文件。

关于您询问的方法,我真的认为这是一个 XY 问题(在线搜索该术语!)。尝试重命名导入的函数是非常不自然的,至少对于普通读者来说是不寻常的和令人惊讶的。不过,使用一组包装函数是一种常见的方法。

此外,对于不像示例那么简单的函数,您有时会动态分配返回值或返回的错误代码。在这两种情况下,包装器代码不会只是以不同的名称提供相同的功能。对于动态分配的返回,它将使用容器或智能指针,对于错误代码,它将使用异常。无论如何,这些都是您无法通过破解链接器来重命名符号来表示的东西。

【讨论】:

    猜你喜欢
    • 2012-12-20
    • 2017-06-07
    • 1970-01-01
    • 2011-11-15
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多