c++ - 许多功能的单个 DLL 入口点

标签 c++ dll entry-point

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

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

例如:

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

Func1
Func2
Func3

都有不同的入口

建议的解决方法:

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

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

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

最佳答案

您提出的转型不会改变任何东西。这些函数仍然是事实上的函数,只是改变了参数等等。

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

首先会发生的事情是,使用带有函数号的显式“ioctl-like”分派(dispatch)的程序员不会非常喜欢它,他们会编写隐藏分派(dispatch)的 stub 例程,这将使他们的代码更具可读性,让他们做一些事情,比如在各个函数上放置断点。这些包装器 stub 很可能具有与原始函数完全相同的签名,因此您回到原点。

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

关于c++ - 许多功能的单个 DLL 入口点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20184840/

相关文章:

c++ - 应用程序的响应时间与给定时间段内的输入触发器数量不直观相关

c++ - QFileInfo size() 返回快捷方式目标大小

c++ - 解释颜色函数和调整像素值

通过 WIX 安装程序安装的带有 CLI 项目 EXE 的 C# 不起作用

visual-c++ - _WinMainCRTStartup 执行什么功能?

c++ - 可中断排序函数

C# Assembly.LoadFrom(myNetworkPath) 抛出 FileLoadException

python - 在 Windows 上嵌入 Python : why does it have to be a DLL?

java - 将 java 入口点设置为一个 JAR 中另一个 JAR 中的类

java - 为什么 Java 程序需要 "main()"方法?