我使用QAxBase和QAxObject读取excel文件。
我得到了全局变量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;
}谢谢!
发布于 2013-10-29 21:54:34
可能你有一个悬空的指针。使用QPointer<QAxObject>而不是裸指针。当QAxObject实例被销毁时,它将自己重置为null。
一般来说,在这个时代,你不应该用裸露的指针来做任何不被其他东西隐式拥有的东西。这意味着对于有父母的QObjects,您不需要使用智能指针(尽管它不会伤害任何指针)。一般来说,聪明的指针是无害的。用它们。
https://stackoverflow.com/questions/19667804
复制相似问题