多个dll导出相同函数时的调用问题
2011-07-04 16:51
357 查看
假设这样的情景:
一个exe加载了两个dll(dll1和dll2,并使用隐式加载)。dll和dll2都同时向外导出一个函数:
int add(int a, int b);
如果在exe中调用了add函数,那么它调用的会是哪个dll的add函数呢?
为了验证这个结果,写了一个测试的例子。两个dll(win32的dll)分别取名位MyDll1和MyDll2,并让他们导出同样的上述add函数,只是在实现的时候加了一个打印输出,用以区分到底是哪个dll调用。
最终发现是和在工程配置中的lib顺序相关的。也就是说,如果在【Link】的Object/library modules中的顺序为MyDll1.lib MyDll2.lib(MyDll1在前),主程序中调用的是MyDll1中的函数实现;相反,如果工程中配置的是MyDll2.libMyDll1.lib(MyDll2在前),主程序中调用的是MyDll2中的函数实现。
看到结果后想,这似乎是合理的。exe发现一个函数调用,而且是在dll中的。它就会遍历自己所加载的dll去搜索,这个应该就是顺序关键性的所在,找到第一个匹配的,就执行调用。所以,谁在前,调用谁。
对此情形,想到另外一个问题。对于较大的程序来说,往往要分成若干个模块。而常常为了接口的统一,需要在dll中导出相同的函数。那么主程序怎么才能调用想要执行的模块中对应的函数呢?
一个最简单也直接的办法就是使用动态加载,并在LoadLibrary后,使用GetProcAddress。
一个exe加载了两个dll(dll1和dll2,并使用隐式加载)。dll和dll2都同时向外导出一个函数:
int add(int a, int b);
如果在exe中调用了add函数,那么它调用的会是哪个dll的add函数呢?
为了验证这个结果,写了一个测试的例子。两个dll(win32的dll)分别取名位MyDll1和MyDll2,并让他们导出同样的上述add函数,只是在实现的时候加了一个打印输出,用以区分到底是哪个dll调用。
最终发现是和在工程配置中的lib顺序相关的。也就是说,如果在【Link】的Object/library modules中的顺序为MyDll1.lib MyDll2.lib(MyDll1在前),主程序中调用的是MyDll1中的函数实现;相反,如果工程中配置的是MyDll2.libMyDll1.lib(MyDll2在前),主程序中调用的是MyDll2中的函数实现。
看到结果后想,这似乎是合理的。exe发现一个函数调用,而且是在dll中的。它就会遍历自己所加载的dll去搜索,这个应该就是顺序关键性的所在,找到第一个匹配的,就执行调用。所以,谁在前,调用谁。
对此情形,想到另外一个问题。对于较大的程序来说,往往要分成若干个模块。而常常为了接口的统一,需要在dll中导出相同的函数。那么主程序怎么才能调用想要执行的模块中对应的函数呢?
一个最简单也直接的办法就是使用动态加载,并在LoadLibrary后,使用GetProcAddress。
相关文章推荐
- 动态加载DLL实现不同DLL的相同导出函数调用问题
- dll导出函数名称和系统API名字相同冲突问题
- 显示调用DLL 应该注意DLL导出函数的调用约定问题
- JNI引用C++dll若干问题总结-如何导出C++中的类成员函数
- C#调用C++ dll导出函数提示找不到指定模块 by:凉游浅笔深画眉 / Net7Cracker
- 调用未知DLL中的导出函数[转]
- 为什么两次调用同一函数, 输入相同, 输出却不同呢? (解决困扰自己好几天的问题, 还是有点激动哈, 奖励自己一顿丰厚的晚餐)
- 动态加载dll的导出函数的问题
- 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?
- 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?(转)
- 工作问题积累(十九)使用dumpbin命令查看.dll(动态链接库)中导出函数
- Linux内核模块导出后无法调用问题解决(模块间函数调用通讯)
- 解决DLL导出函数的名字改编问题
- delphi中调用外部dll导出函数
- Linux内核模块导出后无法调用问题解决(模块间函数调用通讯)
- vb动态加载dll的一个类,实现vb动态加载dll并动态调用dll导出的函数的一个方便办法
- C#动态地调用Win32 DLL中导出的函数
- 调用未知DLL中的导出函数[转]
- MFC扩展dll里导出函数时资源切换的问题
- C# 调用 C++ dll 动态链接库中多个函数时全局变量的问题