C++ 多个函数的单个DLL入口点
在常规DLL中,DLL中通常有入口点和函数的1:1映射。我有一个DLL,它有大约50个函数。维护它们是一件烦琐的事情,如果签名或类型发生变化,那么它们都必须更新,等等 我正在考虑为它们创建一个入口点,并发送一段代码,指导单个入口点在DLL中调用哪个函数。这会导致瓶颈之类的问题吗,特别是在线程安全的DLL中?我想不出有什么缺点,因为这种方法将模拟COM入口和/或VTABLE或类似入口点的查找 例如: 在普通DLL中,可以导出以下三个函数:C++ 多个函数的单个DLL入口点,c++,dll,entry-point,C++,Dll,Entry Point,在常规DLL中,DLL中通常有入口点和函数的1:1映射。我有一个DLL,它有大约50个函数。维护它们是一件烦琐的事情,如果签名或类型发生变化,那么它们都必须更新,等等 我正在考虑为它们创建一个入口点,并发送一段代码,指导单个入口点在DLL中调用哪个函数。这会导致瓶颈之类的问题吗,特别是在线程安全的DLL中?我想不出有什么缺点,因为这种方法将模拟COM入口和/或VTABLE或类似入口点的查找 例如: 在普通DLL中,可以导出以下三个函数: Func1 Func2 Func3 它们都有不同的入口点
Func1
Func2
Func3
它们都有不同的入口点
建议的解决方法:
调用方调用Func1(iCode)
到DLL中
在DLL映射中将iCode
中的Func1
导出到Func2或Func3或Func4。。。功能50等
这样,只需要维护1个签名(带有显式链接),而不是50个。我无法预见这里会有任何真正的瓶颈。我遗漏了什么明显的东西吗?你提出的转变不会改变任何东西。这些函数仍然是具有不断变化的参数等的事实函数 选择表中函数的数字只是函数寻址的另一种形式 首先,使用带有函数号的显式“ioctl-like”分派的程序员将不太喜欢它,他们将编写存根例程来隐藏分派,这将使他们的代码更具可读性,并允许他们在单个函数上放置断点。这些包装器存根很可能与原始函数具有完全相同的签名,因此您回到了原点
哦,在Windows上,DLL中的函数已经由数字索引寻址了!
.def
文件为名称分配序号,或类似的内容 我看不出这会使你的事情变得更简单。例如,您将如何处理调用约定(参数计数和类型)中的更改?所有参数计数和类型都可以包含在具有单个dll入口点的单个签名中。在这种情况下,我看到的唯一开销将是从公共入口点到dll中实际函数的额外跳转/调用。您能否展示一些您试图避免的示例代码?您的描述相当混乱,这类似于Microsoft对其COM接口所做的操作—每个函数调用都是通过IDispatch::Invoke进行的。当然,IDispatch要复杂得多。