大家好,今天遇见一个问题,请教一下大家,谢谢。我有一个工程,编译生成一个EXE和DLL文件。安装包会把它们分别安装到C盘下的两个目录中,并注册环境变量。此时在测试机上无论先运行EXE再打开文件或者双击文件自动由关联到的EXE打开都正常。现在,我的C盘里已经有了一个老版本的EXE和DLL文件,它们是匹配的。由于创建这个EXE和DLL的工程本身并不在C盘,因此我编译出来的EXE和DLL都在工程的RELEASE目录下。如果我运行RELEASE目录下的新的EXE并且创建一个文件在RELEASE目录下,关闭EXE,再双击此文件,此时它确实是由C盘的EXE打开的,但是调用的DLL确实RELEASE目录下的,而不是C盘下的。这样就造成了不匹配。此DLL在工程中是通过LoadLibrary( "xxxx.dll" )加载的。请问是什么原因造成C盘的EXE却调用了RELEASE目录下的DLL文件?

解决方案 »

  1.   

    C盘下面的exe和你的工程有什么关系啊?说明白
      

  2.   

    之前的文件都存在什么位置呢?
    还有就是你LoadLibrary是不是用相对目录找的dll
      

  3.   

    Exe调用Dll时默认情况下调用的当前工作目录下面的dll,如果当前工作目录下没有dll,则查找系统路径下面有没有dll,如果再没有,则执行错误,调用失败
    你的情况:exe和dll在release目录下,运行exe时,当前目录和工作目录都是指向release下,所以没有错,但是当你单击文件时,由于在注册表里打开该文件类型的exe有过注册,它会去查注册表,找到的是c盘下的exe打开,但是当前的工作却还是release,所以调用的dll还是release下的,所以造成不匹配。
      

  4.   

    LoadLibrary最好写绝对路径,可以用GetModuleFileName得到exe路径。
      

  5.   

    再双击此文件,此时它确实是由C盘的EXE打开的,但是调用的DLL确实RELEASE目录下的,而不是C盘下的。这样就造成了不匹配。此DLL在工程中是通过LoadLibrary( "xxxx.dll" )加载的。
    -------------------------------------------------------------------------------------
    双击时调用谁是注册表决定的,你安装时写入了“用C盘的exe来打开此类型文件”,因此会执行c盘的exe。
    dll的加载,在你没有写完整路径的情况下,会先在当前目录找,最后才会找到path里去。因此会找到release下的。
      

  6.   

    C盘DLL注册了没有?默认肯定实在release目录下找dll