最近在做一个Qt项目,在产品发布的时候一直为找不到程序到底缺少了哪些dll组件而困扰。具体问题是,在我的项目中使用到了QMediaPlayer播放一段音频文件,我使用的开发环境的Win7 32位,而在发布安装包的时候,还是照常去掉Qt相关的环境变量,然后运行可执行程序,提示缺少什么dll,我就向可执行程序的目录下拷贝对应的dll,直到程序可以正常启动运行。就是按照上面的方法,我制作了软件的安装包,但是,当将这个软件安装到XP系统上测试时,发现程序没有声音了,这个问题让我很纠结。
后来,我在网上找到了一条线索,就是通过软件来查看可执行程序调用的dll模块,然后我就可以根据列举的dll模块信息,将缺少的补充上去即可,我选择的比较常用的OllyDebug。OllyDebug是一款功能非常强大的32位汇编及分析调试器,也是当前最为流行的解密利器了。一个全新可视化的动态追踪工具,可以完全替代SoftICE,是当前功能最为强大的调试工具,能够处理其他同类软件所无法处理的问题。可以自定义设置的外观及运行参数,支持多种数据格式,支持代码高亮及多线程高度,可以自动分析函数的运行过程及循环语句等,可以增加2进制代码的可读性,让调试变得更为简单。可能将调试的程序单独保存为文件,可以继续加载使用。
我在这里共享了这个软件的英文版和中文版的工具下载地址:
英文版:http://pan.baidu.com/s/1i3oUsuD
中文版:http://pan.baidu.com/s/1o6qfZmU
由于软件功能太强大,我也就只能在这里针对我遇到的问题,介绍一下我们怎么查找程序调用的dll模块的,这里我使用的是英文版。
首先,解压软件包,运行其中的可执行文件,如下图:
打开程序以后,我们需要打开待观察的可执行文件(*.exe),依次点击菜单“File -> Open”,然后在弹出的文件对话框中找到对应的可执行程序,如下图所示。
打开软件以后,OllyDebug的主界面显示如下:
然后,依次选择菜单中的“View -> Executable modules”,会跳转到下图所示的界面,其中即列举了被观察的可执行程序当前加载的dll模块。
再接着,我们需要全速运行此程序,观察加载的dll模块的变化。单击如下图红色方框中的“运行”按钮。
然后,我们就可以看到程序开始加载dll,并列举出来,最新调用的dll用红色字体标示了出来,如下图所示。
我们就可以通过依次检查列举出来的每一个dll是否已经拷贝到了可执行目录下。说明:调用的系统文件中的dll不用管,我们只关心的是类库中提供的dll有没有拷贝。
结论:在Qt应用中使用到多媒体时,一定要向可执行目录下面添加plugins中的mediaservice目录,我的平台上的路径为C:QtQt5.1.15.1.1mingw48_32pluginsmediaservice,否则,程序可能工作不正常,但是并没有提示错误。