请教一个dll调用问题

hlq83 2010-05-10 04:10:54
应用程序A动态链接dll B,C. B,C都有导出方法FunA。问A中调用FunA时是调用那个DLL的。
...全文
87 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hlq83 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lisunlin0 的回复:]
类似的问题已经被多次討論过了,
如果b.dll和c.dll都导出了无函数名修饰的FuncA函数,
没有特别方便的解决方法(楼主要失望了)可以区别它们。
1、使用分模块查找的方法:
b_funcA = GetProcessAdress(GetModule(_T("a.dll")), "FuncA");//假设a.dll已经加载
c_funcA = GetProcessAdress(……
[/Quote]
lisunlin0 给我讲些3的机制吧,其实我知道怎么明确去调用具体哪个dll的FuncA。我想知道如果程序A不明确调用哪个dll的FuncA时,它是怎么个查找法?
“a.obj本身->a.lib内其它obj模块->a.lib以外的函数“ 查找a.lib以外的函数,它发现两个,随机取一个吗?
sunlin7 2010-05-12
  • 打赏
  • 举报
回复
类似的问题已经被多次討論过了,
如果b.dll和c.dll都导出了无函数名修饰的FuncA函数,
没有特别方便的解决方法(楼主要失望了)可以区别它们。
1、使用分模块查找的方法:
b_funcA = GetProcessAdress(GetModule(_T("a.dll")), "FuncA");//假设a.dll已经加载
c_funcA = GetProcessAdress(GetModule(_T("c.dll")), "FuncA");//假设b.dll已经加载
2、使用d.dll包装b.dll(或者c.dll):在d.dll里面使用另外的名字(例如 dFuncA )转发b.dll的FuncA函数。
3、根据链接时函数名查找顺序原理:假设a.c里面调用了FuncA函数,编译后生成a.obj,并被打包在a.lib里面,则FuncA的查找顺序是“a.obj本身->a.lib内其它obj模块->a.lib以外的函数“。这时a.c里面只能调用b.dll或者c.dll某一个模块的函数,否则仍不可区分FuncA函数所在模块。
ljz888666555 2010-05-10
  • 打赏
  • 举报
回复
你可以考虑下,
#define
如Windows下的API
#define SetWindowsText SetWindowsTextA
#define SetWindowsText SetWindowsTextW
hlq83 2010-05-10
  • 打赏
  • 举报
回复
没有人回答到点子上,其实我想知道它是如何去找调用函数的。
xhuacmer 2010-05-10
  • 打赏
  • 举报
回复
这个一般是A吧,就要看你是导出那个DLL了
真相重于对错 2010-05-10
  • 打赏
  • 举报
回复
那当然会有问题,这叫dll hell
hlq83 2010-05-10
  • 打赏
  • 举报
回复
我是动态链接的,不是动态加载
wltg2001 2010-05-10
  • 打赏
  • 举报
回复
应用程序A动态链接dll B,C. B,C都有导出方法FunA。问A中调用FunA时是调用那个DLL的。
========
动态调用没有这个问题的,
yschenwei 2010-05-10
  • 打赏
  • 举报
回复

HMODULE LoadLibrary(
LPCTSTR lpFileName
);

的时候 传进去的是哪个DLL的名称,得到的就是这个动态库的句柄。

调用方法是用 GetProcAddress 。

FARPROC GetProcAddress(
HMODULE hModule,
LPCSTR lpProcName
);

传入的第一个参数就是 动态库的句柄,第二个参数是方法名。

明白了吧。
真相重于对错 2010-05-10
  • 打赏
  • 举报
回复
loadlibrary
getprocessaddress

15,471

社区成员

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

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