在常规 DLL 中,通常存在 DLL 中入口点和函数的 1:1 映射。我有一个包含大约 50 个函数的 DLL。维护所有这些是一件苦差事,如果签名或类型发生变化,则必须更新它们等等。
我正在考虑为它们全部创建 1 个入口点,并发送一个代码来指示单个入口点在 DLL 中调用哪个函数。这会导致瓶颈之类的问题,尤其是在线程安全的 DLL 中吗?我想不出有什么缺点,因为这种方法会模仿 COM 入口和/或从 VTABLE 或类似的入口点查找。
例如:
在一个普通的 DLL 中,可能会导出以下三个函数:
Func1
Func2
Func3
都有不同的入口
建议的解决方法:
调用方将 Func1(iCode)
调用到 DLL 中
在 DLL 中导出 Func1
将 iCode
映射到 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/