有两个动态链接库,
A.dll  
B.dll
置于同一目录下。A中有一个方法TestA,B中有一个方法TestB,TestA被调用时,TestA中要调用TestB,调用TestB时,要动态地加载B.dll,加载时要如何才能得到A和B所处的路径??也就是如何在一个dll中获取该dll所处的位置??

解决方案 »

  1.   

    如果能保证A和B在同一个目录下,则直接用相对路径就可以
    否则,获得A的instance,然后调用GetModuleFileName
      

  2.   

    CString strExePath;
    GetModuleFileName(AfxGetInstanceHandle(),(LPTSTR)(LPCTSTR)strExePath,MAX_PATH);
    strExePath.TrimRight("\\***.exe");  //你的应用程序的名字
    MessageBox(strExePath);
    以上代码获取当前应用程序的目录,然后再根据你的dll所在的文件夹strExePath += "**",或者CString strDllName;
    strDllName.Format("%s\\Dlls\\A.dll",strExePath); //这个就是你的dll文件地址
      

  3.   

    楼上的两位大哥,关键是我的应用程序.exe的位置不能确定,能确定的只是A和B在同一目录下,而且应用程序可以找到A,现在关键问题就是如何在A中找到B,你们说的GetModuleFileName我也试过了,但只能找到应用程序.exe的位置,找不到A、B所在的位置。
      

  4.   

    如果dll有DllMain函数,则DllMain函数里的参数hModule就是dll的instance
      

  5.   

    否则,可以参考以下代码:
    #if   _MSC_VER   >=   1300         //   for   VC   7.0
        //   from   ATL   7.0   sources
        #ifndef   _delayimp_h
        extern   "C"   IMAGE_DOS_HEADER   __ImageBase;
        #endif
    #endifHMODULE   GetCurrentModule()
    {
    #if   _MSC_VER   <   1300         //   earlier   than   .NET   compiler   (VC   6.0)    //   Here's   a   trick   that   will   get   you   the   handle   of   the   module
        //   you're   running   in   without   any   a-priori   knowledge:
        //   http://www.dotnet247.com/247reference/msgs/13/65259.aspx    MEMORY_BASIC_INFORMATION   mbi;
        static   int   dummy;
        VirtualQuery(   &dummy,   &mbi,   sizeof(mbi)   );    return   reinterpret_cast<HMODULE>(mbi.AllocationBase);#else         //   VC   7.0    //   from   ATL   7.0   sources    return   reinterpret_cast<HMODULE>(&__ImageBase);
    #endif
    }
      

  6.   

    那么总有一中方法能找到DLL或EXE其中之一吧?
    不然你的程序是如何加载DLL的呢?或者DLL与程序有固定的相对位置,这种情况的话,就先查找查找EXE程序的路径,然后从这个路径查找出DLL路径。
    或者DLL在系统的环境变量所设置的某个目录下。是这种情况的话,就查看系统文件夹或其他path设置的位置。

    只要有一定的查找规律,总是可以找到的。不过,大哥您的问题到底是哪一种呢?