Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-138093

winrt::init_apartment(multithreaded) causes QFileDialog::getOpenFileName to get stuck

    XMLWordPrintable

Details

    • Bug
    • Resolution: Unresolved
    • P2: Important
    • None
    • 6.9
    • QPA: Windows
    • None
    • MSYS2 Clang64 (UCRT)
    • Windows

    Description

      Repro:

      #include <QApplication>
      #include <QFileDialog>
      #include <QMainWindow>
      #include <QPushButton>
      
      #include <winrt/Windows.Foundation.h>
      int main(int argc, char *argv[])
      {
         // equivalent to init_apartment(apartment_type::multi_threaded): 
          winrt::init_apartment();
      
          QApplication a(argc, argv);
          QMainWindow w;
          w.show();
          QFileDialog::getOpenFileName(&w);
          return a.exec();
      }
      
      cmake_minimum_required(VERSION 3.19)
      project(test-bug-winrt LANGUAGES CXX)
      
      find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets)
      
      set(CMAKE_CXX_STANDARD 20)
      qt_standard_project_setup()
      
      qt_add_executable(test-bug-winrt
          WIN32 MACOSX_BUNDLE
          main.cpp
          mainwindow.cpp
          mainwindow.h
      )
      
      target_link_libraries(test-bug-winrt
          PRIVATE
              Qt::Core
              Qt::Widgets
              RuntimeObject
      )
      

      An error is displayed and the app gets entirely stuck:

      QWindowsContext: OleInitialize() failed:  "COM error 0x80010106: Cannot change thread mode after it is set."
      

      Here is the main thread backtrace:

      Thread 1 (Thread 12844.0x552c):
      #0  0x00007ffe14602654 in ntdll!ZwWaitForMultipleObjects () from C:\WINDOWS\SYSTEM32\ntdll.dll
      No symbol table info available.
      #1  0x00007ffe11c3e5f3 in WaitForMultipleObjectsEx () from C:\WINDOWS\System32\KernelBase.dll
      No symbol table info available.
      #2  0x00007ffe13ea73a4 in combase!CoUnloadingWOW () from C:\WINDOWS\System32\combase.dll
      No symbol table info available.
      #3  0x00007ffe13e9211b in combase!InternalSetOleThunkWowPtr () from C:\WINDOWS\System32\combase.dll
      No symbol table info available.
      #4  0x00007ffe13ea2abb in combase!CoInitializeSecurity () from C:\WINDOWS\System32\combase.dll
      No symbol table info available.
      #5  0x00007ffe13ea25a3 in combase!CoInitializeSecurity () from C:\WINDOWS\System32\combase.dll
      No symbol table info available.
      #6  0x00007ffe13e95f83 in combase!InternalCStdIdentityGetIProxyManager () from C:\WINDOWS\System32\combase.dll
      No symbol table info available.
      #7  0x00007ffe12a45a91 in RPCRT4!NdrClientCall3 () from C:\WINDOWS\System32\rpcrt4.dll
      No symbol table info available.
      #8  0x00007ffe12a455fd in RPCRT4!NdrClientCall3 () from C:\WINDOWS\System32\rpcrt4.dll
      No symbol table info available.
      #9  0x00007ffdfb0ab09e in OneCoreUAPCommonProxyStub!GetProxyDllInfo () from C:\Windows\System32\OneCoreUAPCommonProxyStub.dll
      No symbol table info available.
      #10 0x00007ffdbac15ba8 in QWindowsNativeFileDialogBase::doExec(HWND__*) () from D:\msys64\clang64\share\qt6\plugins\platforms\qwindows.dll
      No symbol table info available.
      #11 0x00007ffdbac1ddf5 in QWindowsDialogHelperBase<QPlatformFileDialogHelper>::exec() () from D:\msys64\clang64\share\qt6\plugins\platforms\qwindows.dll
      No symbol table info available.
      #12 0x00007ffd8d81bd46 in QDialog::exec() () from D:\msys64\clang64\bin\Qt6Widgets.dll
      No symbol table info available.
      #13 0x00007ffd8d82dd48 in QFileDialog::getOpenFileUrl(QWidget*, QString const&, QUrl const&, QString const&, QString*, QFlags<QFileDialog::Option>, QList<QString> const&) () from D:\msys64\clang64\bin\Qt6Widgets.dll
      No symbol table info available.
      #14 0x00007ffd8d82db08 in QFileDialog::getOpenFileName(QWidget*, QString const&, QString const&, QString const&, QString*, QFlags<QFileDialog::Option>) () from D:\msys64\clang64\bin\Qt6Widgets.dll
      No symbol table info available.
      #15 0x00007ff773be1727 in qMain (argc=1, argv=0x56dd50) at D:/dev/test-bug-winrt/main.cpp:14
              a = {<QGuiApplication> = {<QCoreApplication> = {<QObject> = {_vptr$QObject = 0x7ffd8da117f0 <vtable for QApplication+16>, static staticMetaObject = {d = {superdata = {direct = 0x0, indirect = 0x0}, stringdata = 0x7ffd8cb04480 <vtable for QObject+2624>, data = 0x7ffd8cb04370 <vtable for QObject+2352>, static_metacall = 0x7ffd8c840660 <QObject::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, metaTypes = 0x7ffd8cb04500 <vtable for QObject+2752>, extradata = 0x0}}, d_ptr = <incomplete type>}, static staticMetaObject = {d = {superdata = {direct = 0x0, indirect = 0x7ffd8c76fe00 <QMetaObject const* QMetaObject::staticMetaObject<QObject::staticMetaObject>()>}, stringdata = 0x7ffd8cafc338 <vtable for QCoreApplication+1440>, data = 0x7ffd8cafc1b0 <vtable for QCoreApplication+1048>, static_metacall = 0x7ffd8c7ee840 <QCoreApplication::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, metaTypes = 0x7ffd8cafc4a0 <vtable for QCoreApplication+1800>, extradata = 0x0}}, static self = 0x14fdc8}, static staticMetaObject = {d = {superdata = {direct = 0x0, indirect = 0x7ffd8cd900c0 <QMetaObject const* QMetaObject::staticMetaObject<QCoreApplication::staticMetaObject>()>}, stringdata = 0x7ffd8d39a354 <vtable for QGuiApplicationPrivate+4332>, data = 0x7ffd8d39a064 <vtable for QGuiApplicationPrivate+3580>, static_metacall = 0x7ffd8cd8eb00 <QGuiApplication::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, metaTypes = 0x7ffd8d39a6e8 <vtable for QGuiApplicationPrivate+5248>, extradata = 0x0}}}, static staticMetaObject = {d = {superdata = {direct = 0x0, indirect = 0x7ffd8d590040 <QMetaObject const* QMetaObject::staticMetaObject<QGuiApplication::staticMetaObject>()>}, stringdata = 0x7ffd8da11e00 <vtable for QApplication+1568>, data = 0x7ffd8da11c78 <vtable for QApplication+1176>, static_metacall = 0x7ffd8d58f2a0 <QApplication::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, metaTypes = 0x7ffd8da11f98 <vtable for QApplication+1976>, extradata = 0x0}}}
              w = {<QWidget> = {<QObject> = {_vptr$QObject = 0x7ffd8daae020 <vtable for QMainWindow+16>, static staticMetaObject = {d = {superdata = {direct = 0x0, indirect = 0x0}, stringdata = 0x7ffd8cb04480 <vtable for QObject+2624>, data = 0x7ffd8cb04370 <vtable for QObject+2352>, static_metacall = 0x7ffd8c840660 <QObject::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, metaTypes = 0x7ffd8cb04500 <vtable for QObject+2752>, extradata = 0x0}}, d_ptr = <incomplete type>}, <QPaintDevice> = {_vptr$QPaintDevice = 0x7ffd8daae1d8 <vtable for QMainWindow+456>, painters = 0}, static staticMetaObject = {d = {superdata = {direct = 0x0, indirect = 0x7ffd8d59d6f0 <QMetaObject const* QMetaObject::staticMetaObject<QObject::staticMetaObject>()>}, stringdata = 0x7ffd8da1a350 <vtable for QWidget+5712>, data = 0x7ffd8da19ad0 <vtable for QWidget+3536>, static_metacall = 0x7ffd8d5eee60 <QWidget::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, metaTypes = 0x7ffd8da1ab48 <vtable for QWidget+7752>, extradata = 0x0}}, data = 0x5d86d0}, static staticMetaObject = {d = {superdata = {direct = 0x0, indirect = 0x7ffd8d581ca0 <QMetaObject const* QMetaObject::staticMetaObject<QWidget::staticMetaObject>()>}, stringdata = 0x7ffd8daae588 <vtable for QMainWindow+1400>, data = 0x7ffd8daae34c <vtable for QMainWindow+828>, static_metacall = 0x7ffd8d745830 <QMainWindow::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x7ffd8daae840 <vtable for QMainWindow+2096>, metaTypes = 0x7ffd8daae860 <vtable for QMainWindow+2128>, extradata = 0x0}}}
      #16 0x00007ff773be4705 in main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at D:/W/B/src/mingw-w64/mingw-w64-crt/crt/crtexewin.c:66
              lpCmdLine = 0x569547 ""
              nShowCmd = 0
              hInstance = <optimized out>
      

      It works if I call winrt::init_apartment(single_threaded). Problem is that some other libraries may set / force / require winrt::init_apartment(apartment_type::multi_threaded);

      Attachments

        For Gerrit Dashboard: QTBUG-138093
        # Subject Branch Project Status CR V

        Activity

          People

            owolff Oliver Wolff
            jcelerier Jean-Michaƫl Celerier
            Votes:
            1 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:

              Gerrit Reviews

                There is 1 open Gerrit change