VC6.0中不同版本静态方式加载动态库的问题解决过程

背景:
  公司软件使用了一家公司的SDK,针对不同的产品的时候,可能是这个第三方库兼容性的问题,存在使用其新设备的时候,只能用新的库;使用其老设备的时候,只能使用旧版的库,由于同一款软件有可能使用新设备,有可能使用旧设备,所以新旧库的问题需要解决,(有动态库A和动态库B两个dll,在新旧版本中都存在);

寻找解决方案过程:
  1. 首先第一步,想更改旧版的库名称为xxx-old.dll(A动态库),然后把对旧库的调用,全部通过动态LoadLibrary的方式调用到旧的库上;不过这种思路,在修改完毕后才发现,真正有问题的是另外一个dll(B动态库),而不是sdk直接给的.lib里面对应的那个dll;
  2. 然后想通过hook的方式,将对于B动态库导出函数的调用,通过Hook方式全部转发到对应版本的函数中,这个时候发现,由于没有动态库B的头文件(动态库A静态链接动态库B),没有办法取得相应函数的函数原型,网上找了几种方法 undname,dumpbin,IDAPro以及Dependency Walker都没有弄出函数原型;
  3. 最后想到了不如使用稍微简单点的方式,在加载的时候,确定使用哪个版本的dll,这个时候有点问题,这个第三方库是静态链接,即通过 .lib的方式导入的,所以程序再一开始就会进行加载,网上查了一下,可以对指定的库进行延迟加载,于是在链接选项中,增加 /DELAYLOAD:xxxA.dll /DELAYLOAD:xxxB.dll, 然后加入 Delayimp.lib 的链接;
  4. 最后的程序中的方法就是,将新旧库放到不同的目录,在需要调用库函数之前,先确定是调用哪个库,然后将取相应目录的库,拷贝到程序当前目录,这样就能够解决新旧产品的问题了,由于SDK对应设备是固定的,配置完成后,以后都不会再配置,dll的加载一次就OK了,不涉及动态改变的情况,所以这种简单的方式可以满足(当然还有另外一种方法是针对不同产品做不同的安装包,但是这种定制化的安装包多了也会有问题);

以上就是我解决问题的过程,希望能对遇到类似的问题有所帮助。

原文地址:https://www.cnblogs.com/coldforce/p/5909842.html