您的位置:首页 > 编程语言 > Qt开发

为什么release版本的activex 注册失败?而debug版本的却能注册成功?

2016-09-22 15:02 357 查看
一. 问题:

最近项目中需要做一个activex控件嵌入到浏览器中使用。

1、很快用 VS2013+Qt5.6.1 新建了一个 ActiveQt Server 工程,并简单写了一个弹框的测试功能,编译,注册,测试,一切OK。

2、将项目移植到 ActiveQt Server 工程中后,编译,注册,调试,也一切OK。

3、可待打包到别的机器发布安装的时候,报注册失败,经过一番简单的排查后,确定是release版本的就是注册不了(之前测试的时候用的事debug版本的)。

注册命令如下:

regsvr32.exe *.dll


为什么 release 版本的 activex 注册失败呢?而debug版本的却能注册成功?

二. 问题排查:

接下来进入了一轮长达几天的问题排查过程。

1、期间搜索帖子无数,问过N个群友,也问过同行和之前的同事。

有的说是代码问题,有的说是工程配置问题,有的说是动态库不兼容,有的说。。。。。

2、因为对VS不熟,也将工程移植到QtCreator,可表现还是一样: release 版本的 activex 注册失败,而debug版本的却能注册成功。

感觉排除了工程配置的原因。

3、又把之前那个简单的例子拿出来看了看,表现依然一样:release 版本的 activex 注册失败,而debug版本的却能注册成功。

感觉排除了动态库不兼容的原因。

4、于是进入了又一轮无目的的思考过程。

三. 问题解决:

最后在两个同事的启发下找到了问题:

1、怀疑会不会是权限问题? release 版本需要更高的权限?

于是我以管理员方式打开cmd,执行注册命令,还是失败。

2、突然抱找无所谓的态度,把注册动态库的命令后面动态库文件使用了全绝对路径,居然成功了!

3、再一次把批处理里的动态库文件也改成带着全绝对路径,也成功了!

四. 结论:

原来问题的原因是:

release 版本的 activex 注册时,控件动态库文件需要带着全绝对路径;而debug版本的却只要在当前目录就行,当然带上全觉得路径也是可以的。

注册命令如下:

regsvr32.exe "%~dp0*.dll"


添加双引号的原因是保证路径含有空格时能那个正常注册成功。

当然,activex控件注册失败的原因很多,你遇到的问题可能不是上面的原因,但如果也遇到 “release 版本的 activex 注册失败,而debug版本的却能注册成功。”,不妨也试一试这个方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息