【发布时间】: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 中导出 Func1 将 iCode 映射到 Func2 或 Func3 或 Func4,... Func50 等。
这样,只有 1 个签名(带有显式链接)需要维护,而不是 50 个。我无法预见这里有任何真正的瓶颈。我错过了什么明显的东西吗?
【问题讨论】:
-
我看不出这会让你的事情变得更简单。例如,您将如何处理调用约定(参数计数和类型)的变化?
-
所有参数计数和类型都可以包含在具有单个 dll 入口点的单个签名中。
-
在这种情况下,我能看到的唯一开销是从公共入口点到 DLL 中的实际函数的额外跳转/调用。
-
你能展示一些你想要避免的示例代码吗?你的描述比较混乱
-
这类似于 Microsoft 使用其IDispatch COM 接口所做的 - 每个函数调用都是通过 IDispatch::Invoke 进行的。当然 IDispatch 要复杂得多。
标签: c++ dll entry-point