【Qt】有一种Bug叫“麻烦制造者——福昕PDF阅读器”

使用Qt的QAxObject类基于“Microsoft Excel 2007”和“WPS表格”做二次开发(以下将两者称为Excel)。以下代码在基于“WPS表格”二次开发下工作正常,et.exe进程(WPS表格进程)能正常退出。在我开发电脑上,以下代码基于“Microsoft Excel 2007”也工作正常,能到达预期效果。

但是,提交到测试人员处却发现,以下代码基于“Microsoft Excel 2007”工作不正常。不正常情况有二:

当 mpExcel->setProperty("Visible", false);   Excel软件设置为不可见

 

其一:mpWorkbooks->dynamicCall("Open(const QString&)", QVariant(msXlsFile))

提示QAxBase: Error calling IDispatch member Open: Unknown error

 

其二:mpExcel->dynamicCall("Quit()")

EXCEL.exe进程根本没有退出(任务管理器中仍然可见)。

::OleInitialize(0);

QString msXlsFile("E:/QtWrokSpace/Bin/V1.0.xls");
//QAxObject *mpExcel = new QAxObject("et.application");
QAxObject *mpExcel = new QAxObject("excel.application");  
mpExcel->setProperty("Visible", false);

QAxObject *mpWorkbooks = mpExcel->querySubObject("WorkBooks");

// 1.打开表格文件(注意:表格文件采用绝对路径)
mpWorkbooks->dynamicCall("Open(const QString&)", QVariant(msXlsFile));

// 2.查询当前活动表格文件(即Open中打开的文件)对象‘ActiveWorkBook’
QAxObject *mpWorkbook = mpExcel->querySubObject("ActiveWorkBook");

// 3.切换到指定的sheet
QAxObject *mpWorksheet = mpWorkbook->querySubObject("WorkSheets(int)", 1);

// 4.获取该sheet的数据范围(可以理解为有数据的矩形区域)对象
QAxObject *usedrange = mpWorksheet->querySubObject("UsedRange");

// 5.获取行/列对象
QAxObject *rows = usedrange->querySubObject("Rows");
QAxObject *columns = usedrange->querySubObject("Columns");


// 6.开始的行/列索引
int mnStartRow = usedrange->property("Row").toInt();
int mnStartColumn = usedrange->property("Column").toInt();
// 7.该sheet的总行/列数
int mnRowCount = rows->property("Count").toInt();
int mnColumnCount = columns->property("Count").toInt();

// 8.关闭workbook
mpWorkbook->dynamicCall("Close(Boolean)", false);
// 9.退出Excel
mpExcel->dynamicCall("Quit()");

// 10.释放COM对象
delete rows;
delete columns;
delete usedrange;
delete mpWorksheet;
delete mpWorkbook;
delete mpWorkbooks;
delete mpExcel;

::OleUninitialize();

 

       有人说是因为COM对象没有释放,某些引用计数不为0,造成Quit()后EXCEL.exe不会退出!于是仔细调整代码,但凡用到querySubObject()查询到的指针都delete掉。结果仍然是EXCEL.exe进程无法退出,Open(.xls)失败!

        从百度到Google,两天翻了好多相关字眼的文章、博客、论坛、Wiki、A&Q,各种原因方案没有一个能解决上述问题!

        在接近崩溃边缘,在百度里“QAxBase: Error calling IDispatch member Open: Unknown error”查了这么句提示。在以前不屑一顾的贴吧里面找到了答案!

       http://tieba.baidu.com/p/4427699896

       

 

 

         根据这个不起眼的信息,去测试人员电脑检查,果真发现“福昕PDF阅读器”(真不知道是哪来的垃圾软件),更让人无语的是一群测试个个多装了这玩意!

         兜兜转转谁知道是一个无名软件引发的不解Bug之谜!

 

题外话:

       在卸载“福昕PDF阅读器”时,出现下面一幕,莫名的让人觉得开发这个软件的公司是多么垃圾!

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值