多个dll导出相同函数时的调用问题

        假设这样的情景:

        一个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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值