DLL的包含问题,能否在A.DLL中包含B.DLL,使之最终能够具备B.DLL中的全部功能?

mechiland 2003-10-18 08:49:14
请教高手一个问题:原来写有一个B.DLL,后来我发现这个B.DLL功能不足,但是源代码也不见了,现在我想写一个A.DLL来封装他,并且提供更多的函数。外界表现仅为一个A.DLL,那个B.DLL已经不需要了。能实现吗?
...全文
90 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mechiland 2003-10-20
  • 打赏
  • 举报
回复
我试着用了一下DLL2LIB工具,发现他导出的LIB并不是很尽人意啊
microran2000 2003-10-19
  • 打赏
  • 举报
回复
如果你知道函数名称,而不知道参数类型和返回值类型,(参数名称没有用),我想这个DLL肯定不是你编写的.我不知道,你既然不知道函数有几个参数,各个参数对应什么类型,返回值是怎么定义的.那么你怎么调用呢?
函数转发器是通过编译器来实现的,当然你可以手工来转发,自己编写一个代理函数.但是无论是手工还是自动转发都需要你知道函数的定义规范,否则这个DLL无法使用.比如你想拦截这个DLL中的某个函数,让它调用前先执行你的代码,然后在调用自身.如果你不知道函数有几个参数.怎么实现.
尽管对代码反汇编可以知道每个函数究竟有几个参数.(通过堆栈指针来察看),也可以跟踪加载程序,来发现入栈参数的个数来确定参数的个数.一般地,DLL输出函数都是通过EAX寄存器来返回结果的,但是这个寄存器究竟存放的是数值还是指针,你只有跟踪代码才能得到.
所以你在使用这个DLL之前首先需要得到或者整理一个文档说明,才能实现A.DLL.

poweruser 2003-10-19
  • 打赏
  • 举报
回复
关注ing^^^^^
mechiland 2003-10-19
  • 打赏
  • 举报
回复
虽然比较晕,但是大概能够明白意思。

“比如你想拦截这个DLL中的某个函数,让它调用前先执行你的代码,然后在调用自身”,我不明白,我只想将B.DLL中的方法原封不动的迁移到A.DLL中而已,从而使A.DLL更加强大并且不依赖B.DLL,也不需要调用前执行我的代码啊?
microran2000 2003-10-19
  • 打赏
  • 举报
回复
可以试一下Dll2LIB工具,以链接静态库方式代替动态链接库:
http://www.winportal.com/file.asp?ObjectID=6333
MilitaryMiniatures 2003-10-19
  • 打赏
  • 举报
回复
Windows核心编程这本书上,关于Dll的部分,有很好的解释!
mechiland 2003-10-18
  • 打赏
  • 举报
回复
高手啊高手!!
这个问题困扰我很久……感动

1 我现在知道输出函数的名称,但是不知道具体的参数名称,影响使用吗?如果照那种“函数转发器”的思路,应该是能够用的吧?
2 嵌入到A.DLL中的B.DLL如何解压?如果采用届压的办法,那么在写“函数转发器”时路径岂不是不能确定?


microran2000 2003-10-18
  • 打赏
  • 举报
回复
这个问题相对比较复杂,首先尽管B的代码不见了,但是你必须知道B的输出函数的声明,否则在A中也是没有办法用的.
如果你知道函数的所有声明,这个问题应该是很容易解决的.你可以在A中编写与B声明一样的函数,在这些函数中调用B的函数.也可以在A中直接作为函数转发器,当应用程序调用A的输出函数时,会自动调用B的函数.就像Windows 2000的Kernel32.dll一样,尽管这个函数输出了许多API函数,但是实际上它采用函数转发器,真正的函数实现在NTDLL.DLL中.比如HeapAlloc HeapFree等函数
如果你想制作自己的函数转发器可以采用
#pragma comment (linker,"/export:FuncName=B_DLL.FuncName")
其中FuncName是函数名称
B_DLL是B动态链接库的名字.
当然如果你想完全隐藏B,你可以把B.DLL作为一个资源嵌入到A.dll中.在运行是动态把它解压到一个临时目录.调用结束后在把它删掉.
当然你还可以实现动态延迟加载

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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