最近用Qt调用COM组件的方式导出word报告,本来用office导出的,但是office自动更新到某个版本之后,word里面的图片不显示了。只好试试WPS,但是,报错了:
m_wordWidget = new QAxObject();
bool bFlag = m_wordWidget->setControl("word.Application");//初始化COM对象,新建一个word应用程序
if(!bFlag)
{
bFlag = m_wordWidget->setControl("kwps.Application");//尝试用wps打开
if(!bFlag)
return false;
}
报错如下:
QAxBase::setControl:requested control kwps.application could not be instantiated
在网上搜索一番之后,都说是子线程
中使用QAxObject
需要初始化COM
找到了两种初始化的方法:
//方法1
#include <windows.h>
HRESULT r = OleInitialize(0);
if (r != S_OK && r != S_FALSE)
{
qWarning("Qt:初始化Ole失败(error %x)",(unsigned int)r);
}
//使用结束后需要释放
OleUninitialize();
//方法2
#include <windows.h>
CoInitializeEx(NULL, COINIT_MULTITHREADED);
分别试过两种方法后,还是同样的报错。调用office导出没问题,调用WPS就不行,首先肯定排除代码问题了,去研究了一波WPS,设置了什么整合模式,组件模式,各种文件关联各种WPS版本都试过,还是没成功。
灵机一动,用QtCreater写了一个新程序调用WPS,居然成功了!
项目一直使用VS+Qt开发,但是两者的Qt版本是一致的,想到项目是管理员方式运行,而QtCreater是普通用户运行,就想着把管理员方式运行去掉,改为普通用户运行
,果然,调用成功!
附1:
有一种说法是,wps默认只给当前用户注册了com组件,所以在管理员权限下面会找不到wps的com组件
解决方法(亲测无效…):
去administrator用户下重新安装一下wps就好了。在具有管理员权限的其他用户下使用管理员权限也不行,一定要到adminsitartor用户下才行。
如果不能进管理员权限,在当前用户下使用管理员权限运行cmd执行
net user administrator /active:yes
注销后就能够看到adminsitrator用户了。
附2:
大胆猜测,只有adminsitrator用户装了WPS,在adminsitrator用户下运行管理员身份运行的程序才能正确载入WPS,其他用户下装WPS,只能用普通用户身份运行程序才能正确载入WPS。