看到一个dll,能导出来重载函数,这是为什么?

未狂 2018-09-29 06:23:29
项目经手了一套SDK,因为交接问题源码丢失,只留下了打包好的dll
分析这个dll的时候,发现一个问题
它导出了重载函数

我分别用dumpbin分析了lib 和dll



从lib看,DECODE_Start和DECODE_Stop是参数列表不同的重载函数
但是dll分析,却只导出了唯一的函数

这套SDK在C#里被调用的时候,也确实用两种参数列表都能调用成功
DECODE_Start Decode_Stop给不同的参数,都能成功

我记得dll是不能导出同一参数名的重载函数,这是怎么做到的?
...全文
403 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Code_learner_ 2020-11-13
  • 打赏
  • 举报
回复
怎么实现的??? 工作需要,我这边试了下导出重载参数,能导出,不报错。但是很难调用,毕竟不能把一堆符号给同事调用把。 另外 VS2010是不能用extern "C"重载的。C语言格式不支持重载。
linfengc 2018-10-23
  • 打赏
  • 举报
回复
重载本来就可以导出。
未狂 2018-10-10
  • 打赏
  • 举报
回复
引用 6 楼 shihoongbo 的回复:
[quote=引用 4 楼 xiaohuh421 的回复:]
重载函数肯定是允许导出的, 除非是纯c的调用约定, c++是支持的.

这么导出来,dll的接口名称会加上一些符号,和原来的接口名称不一样[/quote]
应该是用extern“C”纯C调用的,不然导出来的接口名称不会这么规整
未狂 2018-10-10
  • 打赏
  • 举报
回复
引用 4 楼 xiaohuh421 的回复:
重载函数肯定是允许导出的, 除非是纯c的调用约定, c++是支持的.

这么导出来,dll的接口名称会加上一些符号,和原来的接口名称不一样
  • 打赏
  • 举报
回复
DLL不能导出同名(或者同序号)函数。就楼主的例子,真正导出的可能是三个参数的那个函数,它在内部判断了一下参数的有效性决定执行哪个。
xiaohuh421 2018-10-09
  • 打赏
  • 举报
回复
问下楼主, 项目没有版本管理吗? SVN,GIT之类的. 如果没有代码, 这种dll 反编译重新写出来吗?
xiaohuh421 2018-10-09
  • 打赏
  • 举报
回复
重载函数肯定是允许导出的, 除非是纯c的调用约定, c++是支持的.
  • 打赏
  • 举报
回复
可以导出吧,函数名一样,参数列表不一样啊,就跟导出两个不同的函数是一样的:
__declspec(dllexport) void fun(int a)
{
//to do
}
__declspec(dllexport) void fun(double a )
{
//to do
}
未狂 2018-09-30
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
用 Dependency Walker 看看, dll 导出的原始函数名应该不是规整前的.

www_adintr_com 2018-09-29
  • 打赏
  • 举报
回复
用 Dependency Walker 看看, dll 导出的原始函数名应该不是规整前的.

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧