0

QAxBase我使用and读取 excel 文件QAxObject

我有一个全局变量QAxObject* db_workbook;,我在其中存储指向某个工作簿的指针(不知道为什么它会这样调用,但无论如何)在 excel 中。我需要它是因为通过它我需要在几个函数中获取 excel 文件数据,而不仅仅是一个。

readExcelFile方法执行良好时,test_function()出现异常

在此处输入图像描述

出现在这一行sheet_N = db_workbook->querySubObject("Worksheets(int)", 1);

为什么会发生以及如何解决?

代码部分在这里

//
QAxObject* db_workbook;

//for read what we need to
void importdb_module::readExcelFile(QAxObject* excel, QString& file_path){

    if(initExcel(excel)){

        QAxObject* workbooks = excel->querySubObject("WorkBooks");
        workbooks->dynamicCall("Open (const QString&)", file_path);
        QAxObject* workbook = excel->querySubObject("ActiveWorkBook");
        db_workbook = workbook;//global ptr points same adress now
        QAxObject* worksheets = workbook->querySubObject("WorkSheets");

        //test getting sheet num 1 name
        QAxObject* sheet_hh = workbook->querySubObject("Worksheets(int)", 1);

        QString sheet_name = sheet_hh->property("Name").toString();

        qDebug()<<sheet_name<<"TEST!";//here everything works fine
    }
}

void importdb_module::test_function(){
    QAxObject* sheet_N;
    //ERROR IS HERE!
    sheet_N = db_workbook->querySubObject("Worksheets(int)", 1);

    QString sheet_name = sheet_N->property("Name").toString();

    qDebug()<<sheet_name;
}


//executes on button click
void importdb_module::testExlOp(QString &_path){
    QAxObject* excel;
    QStringList spreadsheet_list; //get spreadsheet list when opening file
    QString path = _path;//gonna use GUI choose

    if(initExcel(excel)){
        if (readExcelFile(excel, path)){
            //
            test_function();
            excel->dynamicCall("Quit(void)");
            }else{
            //error output
            QMessageBox::information(0, "", "Error");
        }
    }


    delete excel;
}

谢谢!

4

1 回答 1

1

可能你有一个悬空指针。使用QPointer<QAxObject>而不是裸指针。QAxObject当 的实例被破坏时,它将自己重置为 null 。

一般来说,在这个时代,你不应该将裸指针用于任何不被其他东西隐式拥有的东西。这意味着对于QObjects那些有父母的人,您不需要使用智能指针(尽管它不会伤害任何人)。一般来说,智能指针不会受到伤害。使用它们。

于 2013-10-29T21:54:34.237 回答