DLL動態庫巢狀跨級呼叫問題
阿新 • • 發佈:2018-12-15
在應用過程中,動態庫呼叫動態庫是常見操作。其在理論上可行,實施也相對簡單,呼叫層次關係如下:
App主程式---(同目錄)--->DLL_A------(同目錄)----->DLL_B&DLL_C
圖1 呼叫層次關係
針對圖1所示的應用,應對的方法如下:將DLL_B、DLL_C和DLL_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; }
如上程式碼塊所示,紅色部分為拼湊完整路徑程式碼,經測試可實現巢狀跨層級呼叫。