如何在次线程中使用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");


 

走马观花

最近的回复

关注我们

微博
QQ群











召唤伊斯特瓦尔