多个DLL导出同一个函数!这种情况是如何调用的?

bacy001 2011-03-26 08:54:21
一个目录下有:
A.exe B.dll C.dll D.dll 一共四个文件!

A 中调用了函数 void abcd(void);

B.dll C.dll D.dll 均导出了“void abcd(void)”这个函数。

问题:

1.系统会把 B、C、D 三个 Dll 都加载到程序 A 的进程空间么?
2.如果三个 Dll 都已经加载到了 A 的进程空间,那么 A 是如何定位函数“void abcd(void)”的?
...全文
137 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wltg2001 2011-03-27
  • 打赏
  • 举报
回复
用LoadLibrary加GetProcAddress就行了。
beginnow 2011-03-27
  • 打赏
  • 举报
回复
楼主知道一个进程是如何创建的吗?
如果不是显式加载那么这个调用在exe生成的时候就已经确定了
exe的IMPORT节不仅存储了函数名还有dll的名字
sunlin7 2011-03-27
  • 打赏
  • 举报
回复
如果使用LoadLibraray/GetProcAddress进行显式就可以了。
如果是隐式调用,则必须在项目中引入dll对应的lib,即如果打算调用A.dll中函数,则需要在项目中引入A.lib. 如果同时引入A.lib, B.lib...则链接器会发现多重定义而报错。
bacy001 2011-03-27
  • 打赏
  • 举报
回复
如果在程序 A 中,没有明确的 GetProcAddress GetModuleHandle 的指令呢?
IsItNothing 2011-03-26
  • 打赏
  • 举报
回复
用命名空间。
Eleven 2011-03-26
  • 打赏
  • 举报
回复
看你的GetProcAddress的第一个参数指定的是哪个HMODULE(通过LoadLibrary函数返)
Lactoferrin 2011-03-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 bacy001 的回复:]
一个目录下有:
A.exe B.dll C.dll D.dll 一共四个文件!

A 中调用了函数 void abcd(void);

B.dll C.dll D.dll 均导出了“void abcd(void)”这个函数。

问题:

1.系统会把 B、C、D 三个 Dll 都加载到程序 A 的进程空间么?
2.如果三个 Dll 都已经加载到了 A 的进程空间,那么 A 是如……
[/Quote]
A.exe在其导入目录表中指定dll名称,在导入地址表中指定导入符号名
或者使用GetModuleHandle得到dll基地址,然后使用GetProcAddress得到函数地址
fishion 2011-03-26
  • 打赏
  • 举报
回复
AfxSetResourceHandle

15,471

社区成员

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

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