How to fix error code code: 0x8001010e when using getSaveFileName
-
when I debug a very sample code based on qmainwindow as follow
#include "mainwindow.h" #include <QFileDialog> #include <QString> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QString xlsFile = QFileDialog::getSaveFileName(this, QString("111"), QString("E:/GoogleDrive/Projects/QT/FRACTURE/test.xlsx"), QString("excel(*.xls *.xlsx)"), &QString("excel(*.xls *.xlsx)"), QFileDialog::ShowDirsOnly); }
i get this error
:-1: error: Exception at 0x7fff8c3295fc, code: 0x8001010e: , flags=0x1 (execution cannot be continued) (first chance)this error will not shows in release and if i change the option as QFileDialog::DontUseNativeDialog.
I found the explanation of code: 0x8001010e as this:
The error 0x8001010E is RPC_E_WRONG_THREAD "The application called an interface that was marshalled for a different thread.".
You are breaking COM apartment rules and you are attempting to use an interface pointer on a thread that does not belong to apartment the pointer is valid for. To pass interface pointer to another apartment use marshaling.but I still don't know how to fix it.
-
@11hours Hi,friend, welcome.
Why did you not use the
slot function
to open theQFileDialog
?#include "mainwindow.h" #include <QFileDialog> #include <QString> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QPushButton *btn = new QPushButton("save file"); connect(btn,&QPushButton::clicked,this,&MainWindows::SaveFile); } void MainWindow::SaveFile() { QString xlsFile = QFileDialog::getSaveFileName(this, QString("111"), QString("E:/GoogleDrive/Projects/QT/FRACTURE/test.xlsx"), QString("excel(*.xls *.xlsx)"), &QString("excel(*.xls *.xlsx)"), QFileDialog::ShowDirsOnly); }
-
-
@ambershark thanks for your reply!
my system is windows 8.1 64bit, QT version is Based on Qt 5.8.0 (MSVC 2015, 32 bit).
i'm sure that my application is not multi-threaded, i just put my code of getSaveFileName into the codes generated by QT automatically. -
@11hours Hi, friend,
void MainWindow::SaveFile() { QString xlsFile = QFileDialog::getSaveFileName(this, QString("111"), QString("E:/GoogleDrive/Projects/QT/FRACTURE/test.xlsx"), QString("excel(*.xls *.xlsx)"), &QString("excel(*.xls *.xlsx)"), QFileDialog::ShowDirsOnly); ///< why you used the & ??? }
-
Hi, friend, i am so worry not to watch you code careful. the below code is ok in my Mac OS.
I think you used wrong about
selectedFilter
.#include "widget.h" #include <QFileDialog> #include <QTimer> #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent) { QTimer::singleShot(1000,this,&Widget::StSaveFile); } Widget::~Widget() { } void Widget::StSaveFile() { QString filter = QString("excel(*.xls *.xlsx)"); QString selFile = QFileDialog::getSaveFileName(this, QString("111"), QString("E:/GoogleDrive/Projects/QT/FRACTURE/test.xlsx"), QString("excel(*.xls *.xlsx)"), &filter, QFileDialog::ShowDirsOnly); qDebug() << selFile; }
-
From these test, i am sure this error is not your fault.
did you used
DontUseNativeDialog option
, you can test it.QFileDialog::DontUseNativeDialog Do not use the native file dialog. By default, the native file dialog is used unless you use a subclass of QFileDialog that contains the Q_OBJECT macro, or the platform does not have a native dialog of the type that you require.
test code snippet
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),"",tr("Images (*.png *.xpm *.jpg)"),0,QFileDialog::DontUseNativeDialog); qDebug()<< fileName ``
-
From this, I think i got into problem same with you before. ok, you can use one macro in your program, use the windows native file dialog under release version, not use native file dialog under debug version.
void MainWindow::StOpenFile() { /** ... */ #ifdef DONT_USE_NATIVE_DIALOG QStringList ltFilePath = QFileDialog::getOpenFileNames(this, tr("Open files"), defaultDir, QString(STR_OPEN_FILE), 0, QFileDialog::DontUseNativeDialog); #else QStringList ltFilePath = QFileDialog::getOpenFileNames(this, tr("Open files"), defaultDir, QString(STR_OPEN_FILE)); #endif /** ... */ }