概述
使用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阅读器”时,出现下面一幕,莫名的让人觉得开发这个软件的公司是多么垃圾!
最后
以上就是超级丝袜为你收集整理的【Qt】有一种Bug叫“麻烦制造者——福昕PDF阅读器”的全部内容,希望文章能够帮你解决【Qt】有一种Bug叫“麻烦制造者——福昕PDF阅读器”所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复