有如下目录结构程序目录
    |
     ———— myapp.exe
        |
         ———— dll目录1
        |      |
        |       ———— a1.dll
        |      | 
        |       ———— b.dll
         ———— dll目录2
               |
                ———— a2.dll
               | 
                ———— b.dll
我用LoadLibraryEx调用a1.dll和a2.dll,使用参数LOAD_WITH_ALTERED_SEARCH_PATH,由于b.dll中有同名函数,调用a1.dll或a2.dll函数时会发生访问b.dll中函数报错,我想应该是,同名函数的冲突问题,请问如何加载a1.dll和a2.dll使得a1.dll在dll目录1中访问b.dll,而a2.dll在dll目录2中访问b.dll?

解决方案 »

  1.   

    我知道,可是我的目的是要求a1.dll搜索dll目录1,a2.dll搜索dll目录2
    通过LOAD_WITH_ALTERED_SEARCH_PATH能实现吗?我发现是先加载a1.dll则dll目录1的b.dll起效果,否则dll目录2的b.dll起效果
      

  2.   

    a1.dll要加载b.dll,会先在当前目录寻找;a2.dll要加载b.dll,也会先在当前目录寻找,故一般没有问题。实在不行:
    1、显式加载b.dll,指定明确的目录。
    2、将其中的一个b.dll改为其他名字,如bb.dll。
      

  3.   

    这种需求直接写成COM啊,搞的这么复杂
      

  4.   

    改b.dll名,比较难,写成com似乎并不能解决问题,因为inproc Com使用原理和dll一样啊,先loadlibrary ocx文件,然后再初始化com取得对象,仍然无法指定调用b.dll的方式啊。我这个问题好像叫什么"dll hell"(dll陷阱)。不过没找到适合的解决方法。
      

  5.   

    我一般都取exe所在文件夹,然后加上相对路径和文件名来LoadLibrary
    搜索路径我觉得没有必要,像是在给自己找麻烦
    另外可以判断一下dll的版本号,看api是否和exe要求的版本一样
    你可以在dll和exe里写同一相同的版本号宏来判断彼此是否对应
      

  6.   

    dll不是我写的,是引用别人开发的
      

  7.   

    “改b.dll名,比较难”,不会吧?
    复制“b.dll”,将副本改为“bb.dll”,LoadLibrary时加载“bb.dll”,怎么会比较难呢?
      

  8.   

    比较难,唯一方法是,人家改dll文件名