1. 程式人生 > >DLL動態庫巢狀跨級呼叫問題

DLL動態庫巢狀跨級呼叫問題

在應用過程中,動態庫呼叫動態庫是常見操作。其在理論上可行,實施也相對簡單,呼叫層次關係如下:

App主程式---(同目錄)--->DLL_A------(同目錄)----->DLL_B&DLL_C

圖1 呼叫層次關係

針對圖1所示的應用,應對的方法如下:DLL_BDLL_CDLL_A一起放在主App程式同一目錄下即可正常呼叫。

但是,有時候主控App程式只允許DLL_A與Exe在同一目錄,其他DLL只能放在Exe所在目錄的下一級目錄資料夾中,如下圖2所示。

App主程式---(同目錄)--->DLL_A----(下級目錄)------->DLL_B&DLL_C

圖2 巢狀層次關係

針對圖2所示的需求,此時如果不做處理,程式執行時會提示找不到對應的DLL。解決辦法是:通過獲取EXE所在的目錄,拼湊出完整路徑即可正常呼叫。


MATHPROC_API BOOL fnInitMath(void)

{

         TCHAR pPath[1024]={0};

         GetModuleFileName(NULL,pPath,MAX_PATH);

         (_tcsrchr(pPath,'\\'))[1] = 0;

         lstrcat(pPath,_T("\\Other\\"));

         CString dllPath=_T("");

         dllPath.Format("%s",(char *)pPath);

         HINSTANCE  histance = LoadLibrary(_T(dllPath+"AddProc.dll"));//拼湊出完整路徑

         if (nullptr ==histance)

         {

                   return FALSE;

         }

         fnAddproc  = (FunAddProc)GetProcAddress(histance, "fnAddProc");

         if (nullptr == fnAddproc)

         {

                   FreeLibrary(histance);

                   histance = nullptr;

                   return FALSE;

         }

         return TRUE;

}

如上程式碼塊所示,紅色部分為拼湊完整路徑程式碼,經測試可實現巢狀跨層級呼叫。

通過上述實踐,可知,動態庫巢狀呼叫時,只要通過方法獲取到巢狀呼叫DLL的絕對路徑即可實現成功呼叫。