您的位置:首页 > 其它

多个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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐