目录结构如下:
   A
   |
   |-----B
   |
   |-----C
在A目录下有文件a.exe,它要调用B目录下的b.dll文件,b.dll又需要调用C目录下的c.dll。
请问我该如何调用?
如果在a.exe程序的工程中显示加载该文件是可以指定目录的,如果是隐式加载该如何做呢?
我在setings中设置了../B/b.lib来隐式连接,但是编译后a.exe执行时报告找不到b.dll,如果将b.dll文件拷贝到A目录下就没有问题了。
请高手们指点!!!!!!

解决方案 »

  1.   

    当程序启动时如果需要加在dll,系统首先会在当前目录下寻找,然后去windows和system(system32)下去寻找,如果都找不到就报错,所以这个找的过程是跟exe无关的,建议你改为显示调用
      

  2.   

    /B/DeBug/b.lib,DLL文件要拷贝到Exe的目录下
      

  3.   

    隐式加载并不是让Exe自己按照获得Lib的路径去找DLL文件,Exe还没有那么智能,除非是使用了COM技术。
      

  4.   

    显式调用可以直接使用LoadLibrary和GetProcAddress,这种调用也很好使用,这时候DLL放在什么地方,目录层次怎么样都没有很好的控制了,如你的目录结构,你可以获得EXE的路径以后添加“\B\*.DLL”装载DLL文件。
      

  5.   

    如果运行时还是这种结构(比较奇怪的设定),可以在调用exe前设定环境变量path,让它包含dll所在目录。这可能需要另写个 exe loader, 他的任务就是 用设置好的环境变量 来调用你得 exe。如果是编译调试期间的结构,那就更简单了。 专门建立一个项目发行路径,所有的项目输出到该路经就行了。
    结构如下A
    |--bin
    |--B
    |--CABC的项目输出都设定到bin中,或者还可以增加成 release.bin , debug.bin。
      

  6.   

    把两个DLL和exe文件拷贝到一起,然后改为显示加载吧
      

  7.   

    这是当然的,.lib目录只是编译时有用。如楼上所说。
      

  8.   

    a.exe调用b.dll的隐式路径是 ./B/debug/b.lib
      

  9.   

    如果不用显示加载可以吗?如何做?to  whoo(谁) :
    请问“环境变量path”如何设置?可否讲的详细点?
      

  10.   

    CreateProcess 的时候 有个参数 lpEnvironment 是用来指定环境变量的。 通常都设为NULL,表示从父进程继承环境。 可以设置该参数 从而指定 子进程 的环境变量。 而环境变量PATH能影响到装载DLL。
      

  11.   

    to  whoo(谁) :
    不知你有没有相关代码,有的话能够贴出来看看?
    谢谢!!!!!!
      

  12.   

    to  whoo(谁) :
    不知你有没有相关代码,有的话能否贴出来看看?
    谢谢!!!!!!
      

  13.   

    我的dll中要导出类和结构,如果采用显示调用没有办法处理这种情况!
      

  14.   

    //取得当前进程中PATH环境变量。
    GetEnvironmentVariable("PATH", Buffer, 1024);//把新的路径增加进去
    char* pszDllAPath;
    ... Fill pszDllAPath;
    strcat(Buffer, pszDllAPath);
    ...
    // 同样把B的路径也加上去。// 设置当前进程新的PATH环境变量。
    SetEnvironmentVariable("PATH", Buffer);// 使用NULL为 lpEnvironment 参数,让子进程继承当前已经修改过的环境变量。
    CreateProcess(......);
      

  15.   

    谢谢whoo(谁) !!!不过下面这段代码不是很明白,何谓“新的路径”?“B的路径”如何处理,直接在Buffer后面加吗?//把新的路径增加进去
    char* pszDllAPath;
    ... Fill pszDllAPath;
    strcat(Buffer, pszDllAPath);
    ...
    // 同样把B的路径也加上去。不知道你有没有完整的代码,有的话麻烦给我发一份
      

  16.   

    可以把B路径直接设置到环境变量path中。
      我的电脑属性中高级,点击环境变量找到系统变量中的path变量,在其变量值最后面加入B路径。Windows将遵循下面的搜索顺序来定位DLL: 
    1.包含EXE文件的目录
    2.进程的当前工作目录 
    3.Windows系统目录 
    4.Windows目录 
    5.列在Path环境变量中的一系列目录
      

  17.   

    to  loveenic2(徐徐):
    可以通过程序来设置吗?程序将来发布出去后不可能去给每个用户设置呀!
      

  18.   

    当然可以啊。
     楼上已经有人说了
       GetEnvironmentVariable("Path", Buffer, 1024);
       char* AddDllPath;
      把B目录所在路径放到AddDllPath中   strcat(Buffer, pszDllAPath);
       SetEnvironmentVariable("Path", Buffer);
      你去试试看