在应用过程中,动态库调用动态库是常见操作。常见的调用层级有平级调用和嵌套调用两种。
平级调用
其在理论上可行,实施也相对简单,调用层次关系如下:
图1 平级调用
针对平级调用,只需将DLL_B、DLL_C和DLL_A一起放在主App程序同一目录下即可正常调用。
嵌套调用
有时候主控App程序只允许DLL_A与Exe在同一目录,其他DLL只能放在Exe所在目录的下一级目录文件夹中,如下图2所示。
图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的绝对路径即可实现成功调用。