DLL中动态调用DLL

shedawei 2019-03-12 03:42:03
exe动态调用A.DLL
A.DLL还会动态调用B.DLL
A.DLL和B.DLL在同一层路径,exe在A.DLL的上一层



exe调用A.DLL方法:
m_hHandle = ::LoadLibraryEx ( _T("A.DLL的绝对路径") , NULL , LOAD_WITH_ALTERED_SEARCH_PATH );


A.DLL调用B.DLL方法
m_hHandle = ::LoadLibraryEx ( _T("B.DLL的绝对路径") , NULL , LOAD_WITH_ALTERED_SEARCH_PATH );


exe层调用LoadLibraryEx 报错GetLastError = 0


如果将A.DLL中静态加载B.DLL,exe层调用就没问题



有什么好的解决方案吗?

...全文
80 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2019-03-13
  • 打赏
  • 举报
回复
1114 A dynamic link library (DLL) initialization routine failed.
也就是B.DLL 的DllMain 返回了FALSE, 具体的原因的调试或写日志看了

shedawei 2019-03-13
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
是不是B有什么依赖导致加载失败

Depends看了一下B.dll依赖的dll也全部都放在同一级目录了,

exe层调用LoadLibrary报错GetLastError =1114
shedawei 2019-03-13
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
可以试试用 GetModuleFileName 获取模块本身的文件路径名, 然后构造出B.DLL 的绝对路径

TCHAR szPath[MAX_PATH + 1] = {0};
if(GetModuleFileName(AfxGetInstanceHandle( ), szPath, MAX_PATT))
{
PathRemoveFileSpec(szPath); //去除当前模块文件名
PathAppend(szPath, _T("B.DLL)); //追加B.DLL
HMODULE hDLLB = LoadLibrary(szPath);
if(hDLLB)
{
……
FreeLibrary(hDLLB);
}
}


按照你的方法还是一样的错误
oyljerry 2019-03-13
  • 打赏
  • 举报
回复
是不是B有什么依赖导致加载失败
Eleven 2019-03-13
  • 打赏
  • 举报
回复
引用 4 楼 shedawei 的回复:
[quote=引用 2 楼 oyljerry 的回复:]
是不是B有什么依赖导致加载失败

Depends看了一下B.dll依赖的dll也全部都放在同一级目录了,

exe层调用LoadLibrary报错GetLastError =1114[/quote]
需要看一下DllMain入口函数中调用了什么,做了什么操作?
zgl7903 2019-03-12
  • 打赏
  • 举报
回复
可以试试用 GetModuleFileName 获取模块本身的文件路径名, 然后构造出B.DLL 的绝对路径

TCHAR szPath[MAX_PATH + 1] = {0};
if(GetModuleFileName(AfxGetInstanceHandle( ), szPath, MAX_PATT))
{
PathRemoveFileSpec(szPath); //去除当前模块文件名
PathAppend(szPath, _T("B.DLL)); //追加B.DLL
HMODULE hDLLB = LoadLibrary(szPath);
if(hDLLB)
{
……
FreeLibrary(hDLLB);
}
}


15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧