[PATCH 2/2] comdlg32: Delay OleInitialize() for Windows versions older than Vista.

Józef Kucia jkucia at codeweavers.com
Wed Jan 25 07:51:28 CST 2017


This fixes a regression introduced by commit
f65e04770dc5748521a0de73814cea0b085bf3f8.

OleInitialize() creates a window for the main apartment. SimCity 2000
expects that the first created window after GetOpenFileA() is a file
dialog window. According to tests, this is expected to work on Windows
versions before Windows Vista.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/comdlg32/filedlg.c        | 22 ++++++++++++++++------
 dlls/comdlg32/filedlgbrowser.h |  1 +
 dlls/comdlg32/tests/filedlg.c  |  2 +-
 3 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/dlls/comdlg32/filedlg.c b/dlls/comdlg32/filedlg.c
index 67b3566..5bf0ddb 100644
--- a/dlls/comdlg32/filedlg.c
+++ b/dlls/comdlg32/filedlg.c
@@ -236,6 +236,16 @@ static INT_PTR FILEDLG95_HandleCustomDialogMessages(HWND hwnd, UINT uMsg, WPARAM
 static BOOL FILEDLG95_OnOpenMultipleFiles(HWND hwnd, LPWSTR lpstrFileList, UINT nFileCount, UINT sizeUsed);
 static BOOL BrowseSelectedFolder(HWND hwnd);
 
+static void FILEDLG95_InitOle(FileOpenDlgInfos *fodInfos)
+{
+    if (fodInfos->ole_initialized)
+      return;
+
+    /* Some shell namespace extensions depend on COM being initialized. */
+    if (SUCCEEDED(OleInitialize(NULL)))
+      fodInfos->ole_initialized = TRUE;
+}
+
 /***********************************************************************
  *      GetFileName95
  *
@@ -248,14 +258,12 @@ static BOOL BrowseSelectedFolder(HWND hwnd);
  */
 static BOOL GetFileName95(FileOpenDlgInfos *fodInfos)
 {
-
     LRESULT lRes;
     LPCVOID origTemplate;
     DWORD dwSize;
     LPDLGTEMPLATEW template;
     HRSRC hRes;
     HANDLE hDlgTmpl = 0;
-    HRESULT hr;
 
     /* test for missing functionality */
     if (fodInfos->ofnInfos->Flags & UNIMPLEMENTED_FLAGS)
@@ -311,8 +319,8 @@ static BOOL GetFileName95(FileOpenDlgInfos *fodInfos)
       fodInfos->HookMsg.sharevistring = RegisterWindowMessageW(SHAREVISTRINGW);
     }
 
-    /* Some shell namespace extensions depend on COM being initialized. */
-    hr = OleInitialize(NULL);
+    if (LOBYTE(GetVersion()) >= 6) /* since Vista */
+      FILEDLG95_InitOle(fodInfos);
 
     if (fodInfos->unicode)
       lRes = DialogBoxIndirectParamW(COMDLG32_hInstance,
@@ -326,7 +334,7 @@ static BOOL GetFileName95(FileOpenDlgInfos *fodInfos)
                                      fodInfos->ofnInfos->hwndOwner,
                                      FileOpenDlgProc95,
                                      (LPARAM) fodInfos);
-    if (SUCCEEDED(hr)) 
+    if (fodInfos->ole_initialized)
         OleUninitialize();
 
     HeapFree(GetProcessHeap(), 0, template);
@@ -1278,7 +1286,9 @@ INT_PTR CALLBACK FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l
          int gripx = GetSystemMetrics( SM_CYHSCROLL);
          int gripy = GetSystemMetrics( SM_CYVSCROLL);
 
-	 /* Adds the FileOpenDlgInfos in the property list of the dialog
+         FILEDLG95_InitOle(fodInfos);
+
+         /* Adds the FileOpenDlgInfos in the property list of the dialog
             so it will be easily accessible through a GetPropA(...) */
          SetPropA(hwnd, FileOpenDlgInfosStr, fodInfos);
 
diff --git a/dlls/comdlg32/filedlgbrowser.h b/dlls/comdlg32/filedlgbrowser.h
index 60f0e7e..6d108a9 100644
--- a/dlls/comdlg32/filedlgbrowser.h
+++ b/dlls/comdlg32/filedlgbrowser.h
@@ -92,6 +92,7 @@ typedef struct
 	UINT sharevistring;
     } HookMsg;
 
+    BOOL ole_initialized;
 } FileOpenDlgInfos;
 
 /***********************************************************************
diff --git a/dlls/comdlg32/tests/filedlg.c b/dlls/comdlg32/tests/filedlg.c
index 80c9ec1..6ef041b 100644
--- a/dlls/comdlg32/tests/filedlg.c
+++ b/dlls/comdlg32/tests/filedlg.c
@@ -1296,7 +1296,7 @@ static LRESULT CALLBACK hook_proc(int code, WPARAM wp, LPARAM lp)
             /* Before Vista, OleInitialize() is called after the file dialog is
              * created. */
             hr = OleInitialize(NULL);
-            ok(hr == S_FALSE || broken(first_dlg && hr == S_OK),
+            ok(hr == S_FALSE || (first_dlg && hr == S_OK),
                     "OleInitialize() returned %#x\n", hr);
             OleUninitialize();
             first_dlg = FALSE;
-- 
2.10.2




More information about the wine-patches mailing list