[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