登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> SoftHub >> 主题: LoadLibrary 无法加载 DLL 的 bug 处理[zt]     [回主站]     [分站链接]
LoadLibrary 无法加载 DLL 的 bug 处理[zt]
clq
浏览(275 + ) 2018-03-27 10:22:18 发表 编辑

关键字:

[2018-03-27 10:23:54 最后更新]
原文来自大侠云风,提到了好几个软件,值得一试。



原文地址
https://blog.codingnow.com/2018/03/loadlibrary_bug.html


clq  2018-03-27 10:22:43 发表 编辑

LoadLibrary 无法加载 DLL 的 bug 处理

今天我们的小伙伴在把 Open Asset Import Library 封装成 lua 库的时候遇到一些麻烦。他在 vs 集成环境中编译的版本可以用,在 mingw-gcc 下却出错,报告 “找不到指定的模块。” 或是 “找不到指定的程序。" 。

我不得不吐槽,微软真是太有钱了,雇了一大帮人把出错信息都给国际化,这叫中国程序员怎么 google 问题啊。不太懂 windows
,反正我用 export LANG= 切换了 locale 为 C 还是不能把这段用 FormatMessage 格式化出来的
GetLastError 获得的出错码的错误串变成英文。还请读者中的 windows 大牛在留言中赐教。写这篇 blog
的主要目的就是以后有人可以用上面的出错信息关键词 google 过来。让我们一起来吐槽微软。

不过经验告诉我,不管是模块找不到还是什么程序找不到,这是 DLL 依赖问题。DLL 缺失这种问题,Dependency Walker 可以查。这个工具最早在 VC 里就自带,现在也能找到单独下载。不过安装了 mingw/msys 的话,我更喜欢用 ldd 。是的,linux 下的神器 ldd 现在有 windows 版了。

我前段发的 iup 的项目 iupmingw 就有同学碰到过类似的问题:https://github.com/cloudwu/iupmingw/issues/1

不过这次并不是缺少 dll ,为了观察 windows 的加载 dll 过程,它居然不报告到底在哪个环节出错,找不到 dll 也不报告文件名,我动用了另一个神器 ProcessMonitor ,推荐给大家使用。它可以监控进程的系统调用,比如加载动态库呀,打开文件啊,打开注册表啊。有了这个,windows 下写程序就不再是两眼一抹黑了。什么文件删不掉,看看谁锁住了它,用这个都能查到。可是为啥 windows 会有那么多文件锁住不准删这种事呢?

回头来看看 "找不到指定的模块。" 这条信息吧,它的 Error Code 是 126 ,英文是 The specified module could not be found 。用直白的话讲就是某个依赖的 dll 找不到。

"找不到指定的程序。" 这条信息的 Error Code 是 127 ,英文是 The specified procedure could not be found 。用直白的话讲是 dll 都找到了,但是 dll 里需要的符号找不到,通常就是版本有问题。

本文最初的问题应该是在构建的时候混用了 mingw gcc c++ 的 sjlj 和 seh 的异常处理 dll 导致的。这就是另一个话题了。



clq  2018-03-27 10:23:54 发表 编辑


Comments

看到这个,我想起以前项目一个更变态的问题。我们的项目里显示链接了libmq.so, 结果不知道我们的runtime C Library里面有另一份mq的实现,并且使用相同的函数名称(公司自己的kernel和libc) .结果调用mq_open的时候先跑到libmq.so然后再jump到libc里面的内部实现。Process不断crash. 最后靠不断单步执行汇编指令分析地址才发现这个问题。

Posted by: freeprogrammer | (14) March 24, 2018 01:28 PM

Everything搜索到对应语言的kenerl32.dll.mui文件,用ResourceHacker打开,从Message Table里找就好了。可以先从中文的mui文件里根据错误信息搜索到错误码,再在英文的mui里用错误码反查错误信息

Posted by: jacky | (13) March 23, 2018 12:14 PM

chrome在windows下改用clang工具链了

Posted by: heibor | (12) March 18, 2018 09:53 PM

被微软坑了很多年,有些问题我觉得明明它应该知道,就是不提示清楚。

Posted by: Shun | (11) March 16, 2018 04:26 PM

如果FormatMessage指定了语言ID,还想改就只能hook了吧。如果没有指定,第一优先级应该是线程的语言ID,可以用SetThreadUILanguage改。

Posted by: actboy168 | (10) March 16, 2018 12:24 AM

@XY

因为在做 3d engine(以及工具),同 team 的同学希望用 vc 开发,所以尝试用微软工具链构建源代码。

现在 vc 和 gcc 工具链都调通了。

Posted by: Cloud | (9) March 15, 2018 07:47 PM

云风不是都是在LINUX下开发,怎么想起来用VC了?DLL加载不成功一般就是依赖库没有,还有就是DLL里有全局变量在构造函数里导制了崩溃会导制加载DLL不成功。不过C应该是没这个问题

Posted by: XY | (8) March 15, 2018 03:36 PM

Dependence也可以试试,

Posted by: shaderconst | (7) March 15, 2018 02:21 PM

疯狂的SEO

Posted by: 杨博 | (6) March 15, 2018 02:15 PM

在设置或控制面板的"语言"里, 改为英语国家.
如果对英文没什么排斥感, 最好直接装英文版OS和IDE做开发.

Posted by: dwing | (5) March 15, 2018 11:02 AM

@actboy168 就是不想改代码。

Posted by: Cloud | (4) March 15, 2018 10:39 AM

FormatMessage的第四个参数是语言ID,给个英语的语言ID比如MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT),就是英语了。

Posted by: actboy168 | (3) March 15, 2018 12:36 AM

vs 继承环境


云神是指 VS 集成环境吗?

Posted by: Zhangyong NI | (2) March 15, 2018 12:22 AM

Windows下一般的dll问题,不管是找不到还是里面的函数不太对,都可以用Dependency Walker这个东西,非常方便一目了然

Posted by: sz | (1) March 14, 2018 09:44 PM



总数:2 页次:1/1 首页 尾页  
总数:2 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1