Qt使用COM组件(QAxObject)调用WPS无效的问题

62 篇文章 102 订阅
4 篇文章 0 订阅

最近用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。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值