Не могу прочитать данные файла дважды, используя QAxObject

Я читаю файл Excel, используя QAxBase а также 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;
}

Спасибо!

0

Решение

Возможно, у вас есть свисающий указатель. использование QPointer<QAxObject> вместо голого указателя. Он сбросит себя на ноль, когда экземпляр QAxObject разрушается.

Вообще говоря, в наше время вы не должны использовать голые указатели для чего-либо, что явно не принадлежит чему-то другому. Это означает, что для QObjects если у вас есть родители, вам не нужно использовать умные указатели (хотя это не повредит никому). Вообще говоря, умные указатели не повредят. Используй их.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]