如何在次线程中使用COM(我用QAxObject操作word文档)



  • void MyThread::run()
    {
    CoInitialize(NULL);
    QAxWidget *word=new QAxWidget("Word.Application", 0, Qt::MSWindowsOwnDC);
    QAxObject * documents = word->querySubObject("Documents");
    documents->dynamicCall("Add(QString)",QString::fromLocal8Bit("E:/temple/cover.doc"));
    QAxObject *document=word->querySubObject("ActiveDocument");
    // 将文件另存为docbyqt.doc,关闭工作文档,退出应用程序
    document->dynamicCall("SaveAs (const QString&)", QString("E:/1/0.封面.doc"));
    document->dynamicCall("Close (boolean)", false); word->dynamicCall("Quit()");

    CoUninitialize();
    

    }
    我使用了 CoInitialize(NULL)和CoUninitialize()为什么在运行的时候还是报错。
    void MainWindow::on_pushButton_clicked(){ MyThread = new MyThread(this); MyThread->start(QThread::LowestPriority);}错误信息如下:
    ASSERT failure in QWidget: "Widgets must be created in the GUI thread.", file [url]kernel\qwidget.cpp, line 1133[/url]
    Invalid parameter passed to C runtime function.
    Invalid parameter passed to C runtime function.
    QObject::~QObject: Timers cannot be stopped from another thread



  • @Neo 线程里面不能创建GUI对象。这个是断言规定的,要不然会出现一系列的访问错误。让你的程序极度不稳定。所以以后编程的时候要注意这点。



  • pro:
    QT += core axcontainer

    cpp:
    OleInitialize(0);
    _excel = new QAxObject(this);//不是QAxWidget
    _excel->setControl("Excel.Application");
    _excel->dynamicCall("SetVisible(bool)", visible);
    _excel->setProperty("DisplayAlerts", false);
    _workBooks = _excel->querySubObject("WorkBooks");


Log in to reply
 

走马观花

最近的回复

  • 🥚 🥒 🥚

    read more
  • 论坛似乎更换了新的表情呢。我试试看看?♂ ♂ :smiling_face_with_open_mouth_closed_eyes:

    read more
  • 最近尝试将我们动作编辑器的部分装入NDK中,出现了很难解决的问题。导致进行不下去了,后面发现是NDK库调用约定的问题。最后只得发现,只能使用C调用约定才能够顺利地链接成功。☹

    read more
  • qmake输出 warning: winrt_manifest_install.path is not defined: install target not created.

    运行直接报错 Cannot establish connection to the WinRT debugging helper.

    大佬们,我是不是缺什么组件还是怎么回事啊?

    read more

关注我们

微博
QQ群