【问题标题】:Single DLL entry point for many functions许多函数的单个 DLL 入口点
【发布时间】:2013-12-09 16:38:12
【问题描述】:

在常规 DLL 中,DLL 中的入口点和函数通常是 1:1 映射的。我有一个 DLL,它有大约 50 个函数。维护所有这些是一件苦差事,如果签名或类型发生变化,那么它们都必须更新等等。

我正在考虑为它们创建 1 个入口点,并发送一个代码,该代码指示单个入口点在 DLL 中调用哪个函数。这会导致瓶颈等问题,尤其是在线程安全的 DLL 中吗?我想不出任何缺点,因为这种方法会模仿 COM 条目和/或从 VTABLE 或类似的东西中查找一个入口点。

例如:

在普通的 DLL 中,可能会导出以下三个函数:

Func1
Func2
Func3

都有不同的入口点

建议的解决方法:

调用者将Func1(iCode) 调用到 DLL 中

在 DLL 中导出 Func1iCode 映射到 Func2 或 Func3 或 Func4,... Func50 等。

这样,只有 1 个签名(带有显式链接)需要维护,而不是 50 个。我无法预见这里有任何真正的瓶颈。我错过了什么明显的东西吗?

【问题讨论】:

  • 我看不出这会让你的事情变得更简单。例如,您将如何处理调用约定(参数计数和类型)的变化?
  • 所有参数计数和类型都可以包含在具有单个 dll 入口点的单个签名中。
  • 在这种情况下,我能看到的唯一开销是从公共入口点到 DLL 中的实际函数的额外跳转/调用。
  • 你能展示一些你想要避免的示例代码吗?你的描述比较混乱
  • 这类似于 Microsoft 使用其IDispatch COM 接口所做的 - 每个函数调用都是通过 IDispatch::Invoke 进行的。当然 IDispatch 要复杂得多。

标签: c++ dll entry-point


【解决方案1】:

您提出的转型不会改变任何事情。这些函数仍然是事实上的函数,具有不断变化的参数等等。

在表格中选择函数的数字只是对函数寻址的另一种形式。

首先会发生的事情是,使用带有函数编号的显式“类似ioctl”调度的程序员不会非常喜欢它,他们将编写隐藏调度的存根例程,这将使他们的代码更具可读性,并让他们做一些事情,比如在单个函数上放置断点。这些包装存根很可能具有与原始函数完全相同的签名,因此您又回到了原点。

哦,在 Windows 上,DLL 中的函数已经由数字索引寻址! .def 文件将序数分配给名称,或类似的东西。 Look at this MSDN entry.

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 2011-09-30
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多