Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多个函数的单个DLL入口点_C++_Dll_Entry Point - Fatal编程技术网

C++ 多个函数的单个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 它们都有不同的入口点

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

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

例如:

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

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要复杂得多。