On Wed, 20 Dec 2017, Rainer Wiesenfarth wrote:

I have a strange problem that is bugging me for a couple of days now. Although I think the chances are low to find someone who experienced the same issue, I would like to give it a try.

Customers of ours reported issues that look related. We consequently filed https://bugreports.qt.io/browse/QTBUG-49782 and reference it from our Knowledge Base[0].

Harri.

[0] 
https://kb.froglogic.com/display/KB/Automating+native+or+Qt+%28file%29+dialogs+in+Qt+applications#AutomatingnativeorQt%28file%29dialogsinQtapplications-Generalsolution%231Automatethedialogsvia{{nativeType%28%29}}


I was able to strip the interesting part of my application down to these lines:

  QString sProject = QFileDialog::getOpenFileName( this, tr( "Select Project 
File" ),
    m_sProjectFile, tr( "Project File (*.prj);;" "All Files (*.*)" ) );   // (1)

  QPrinter p;   // (2)

  sProject = QFileDialog::getOpenFileName( this, tr( "Select Project File" ),
      m_sProjectFile, tr( "Project File (*.prj);;" "All Files (*.*)" ) );   // 
(3)

Case 1: Running my application on Windows 10 (four different machines):
- (1) succeeds
- (2) succeeds
- (3) hangs the application in QWindowsNativeFileDialogBase::doExec() at 
m_fileDialog->Show(owner)

Case 2: Embedding the above snippet into a small sample application on Windows 
10:
- (1) to (3) all succeed

Case 3: Setting the QFileDialog::DontUseNativeDialog option on Windows 10:
- (1) to (3) all succeed

Case 4: Running my application on Windows 7 (several machines):
- (1) to (3) all succeed

I took a close look at the m_fileDialog in QWindowsNativeFileDialogBase for the 
Windows 10 case that gets stuck:
- at (1), m_fileDialog references a vtable in comdlg32.dll!const CFileOpenSave
- at (3), m_fileDialog references a vtable in 
OneCoreUAPCommonProxyStub.dll!0x...

So it seems to be related to Windows "umbrella" libraries, but I have no idea 
how. I looked even deeper into where m_fileDialog is getting assigned and found
the call to CoCreateInstance(), where CLSID_FileOpenDialog and 
IID_IFileOpenDialog is passed in both (1) and (3), but in (1) the comdlg32 
object is returned
while in (3) it is the OneCore... object.

My guess so far:
1. The constructor or destructor of QPrinter could lead to the replacement of 
the object behind CLSID_FileOpenDialog, but
2. this replacement not done always, but is triggered by the "some magic" part 
in my application that is executed before (1)

​Any ideas what the "​some magic" part could be? Unfortunately my application 
is quite complex and can not be stripped down easily...

​Cheers, Rainer

--
Software Engineer | Trimble Imaging Division
Rotebühlstraße 81 | 70178 Stuttgart | Germany
Office +49 711 22881 0 | Fax +49 711 22881 11
http://www.trimble.com/imaging/ | http://www.inpho.de/

Trimble Germany GmbH, Am Prime Parc 11, 65479 Raunheim
Eingetragen beim Amtsgericht Darmstadt unter HRB 83893,
Geschäftsführer: Dr. Frank Heimberg, Jürgen Kesper


_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to