【问题标题】:Export a small set of methods from dll's?从 dll 导出一小组方法?
【发布时间】:2014-05-23 23:05:27
【问题描述】:

我的软件有很多子项目,这些子项目内置在 dll 中,并且许多方法被导出,因为它们将被其他依赖项目使用。我们现在需要将多个 dll 中的一些功能作为 API 公开给不同的项目,与 dll 上所有当前导出的方法相比,这些 API 是非常小的子集。向外界提供最少的 API 集的最佳方式是什么?

我想,如果我们提供单独的 .h 文件集,其中只有很少的最小导出公共方法,那么该最小集只能由外部世界使用,对吗?这是标准做法吗?有更好的选择吗?

源码在C++,VS2010,windows平台。

【问题讨论】:

    标签: visual-studio-2010 winapi dll dllexport


    【解决方案1】:

    导出的函数已经暴露给外界。为什么不能让有问题的项目使用每个 DLL 所需的部分?

    如果你真的想公开一个更小的 API,我建议创建一个依赖于其他 DLL 的新 DLL,并且只公开你想要公开的函数。您仍然需要分发这些 DLL,但项目不会直接链接到它们,而是会链接到较小的 DLL。

    【讨论】:

    • 是的,导出的方法仍然会被导出,但我认为想要使用 api 的用户会开始查看 .h 文件而不是使用依赖walker 并查看所有导出的符号?您的建议可行,这是标准做法吗?还有其他方法可以给猫剥皮吗?
    • Win32 API 是数千个 DLL 函数的巨大集合,但大多数人只使用其中的一小部分。您是否希望 Microsoft 在较小的 .h 文件和较小的 DLL 中公开 API 的小子集?否。如果您有特定任务,则查找与该任务相关的导出函数,而忽略其他函数。在自定义 API 中也是如此。仅仅因为你导出了很多函数并不意味着它们都必须使用。
    • Win32 api 上的所有导出方法将被世界上至少有人使用,但这里不是这种情况。我们导出大量方法只是因为它被解决方案中的另一个项目使用,它们永远不会对外界有用。
    • @RemyLebeau 实现 Win32 API 的 DLL 导出了许多未记录且未出现在公共头文件中的函数(通常按序号)。即 Microsoft do 在较小的 .h 文件中公开 API 的子集。这正是 Coder777 提出的(没有提到修改 DLL),而且看起来非常明智。
    • @Coder777 没关系;如果有人足够关心,他们会调用 GetProcAddress 并对参数进行逆向工程。这就是 Win32 DLL 所发生的事情。
    【解决方案2】:

    除了@RemyLebeau 所说的之外,仅当您打算使两者保持最新并愿意投入额外工作以保持两者同步时,才创建一个单独的 API。

    在安全性方面,已经提到如果 DLL 导出符号,那么它们可以很容易地被其他程序调用,因此从这个意义上说,提供子集并不会增加安全性。

    这意味着创建公共 API 的选择取决于用户的便利性和需求,而不是技术问题。公开一个子集给用户一个强烈的提示,让他们知道应该使用哪些方法。这些担忧与必须维护额外 API 的成本相权衡。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      相关资源
      最近更新 更多