DLL动态库嵌套调用问题

在应用过程中,动态库调用动态库是常见操作。常见的调用层级有平级调用和嵌套调用两种。

平级调用

其在理论上可行,实施也相对简单,调用层次关系如下:

图1 平级调用

针对平级调用,只需DLL_BDLL_CDLL_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的绝对路径即可实现成功调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值