=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: comdlg32/tests: Add test for OLE initialization in file dialogs.

Alexandre Julliard julliard at winehq.org
Thu Feb 2 15:49:27 CST 2017


Module: wine
Branch: master
Commit: 5dda6495eb9cc6f0d9f35a3720f78d6f963d7070
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5dda6495eb9cc6f0d9f35a3720f78d6f963d7070

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Thu Feb  2 16:10:05 2017 +0100

comdlg32/tests: Add test for OLE initialization in file dialogs.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/comdlg32/tests/filedlg.c | 69 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)

diff --git a/dlls/comdlg32/tests/filedlg.c b/dlls/comdlg32/tests/filedlg.c
index 9270b66..89aa8fa 100644
--- a/dlls/comdlg32/tests/filedlg.c
+++ b/dlls/comdlg32/tests/filedlg.c
@@ -1266,6 +1266,74 @@ static void test_directory_filename(void)
     todo_wine ok(!ret, "GetOpenFileNameW returned %#x\n", ret);
 }
 
+static UINT_PTR WINAPI test_ole_init_wndproc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+    HRESULT hr;
+
+    hr = OleInitialize(NULL);
+    ok(hr == S_FALSE, "OleInitialize() returned %#x\n", hr);
+    OleUninitialize();
+
+    if (msg == WM_NOTIFY)
+        PostMessageA(GetParent(dlg), WM_COMMAND, IDCANCEL, 0);
+    return FALSE;
+}
+
+static LRESULT CALLBACK hook_proc(int code, WPARAM wp, LPARAM lp)
+{
+    static BOOL first_dlg = TRUE;
+    HRESULT hr;
+
+    if (code == HCBT_CREATEWND)
+    {
+        CBT_CREATEWNDW *c = (CBT_CREATEWNDW *)lp;
+
+        if (c->lpcs->lpszClass == (LPWSTR)WC_DIALOG)
+        {
+            /* OleInitialize() creates a window for the main apartment. Since
+             * Vista OleInitialize() is called before the file dialog is
+             * created. SimCity 2000 expects that the first window created
+             * after GetOpenFileA() is a file dialog window. Mark Vista+
+             * behavior as broken. */
+            hr = OleInitialize(NULL);
+            todo_wine_if(first_dlg)
+            ok((first_dlg ? hr == S_OK : hr == S_FALSE)
+                    || broken(first_dlg && hr == S_FALSE),
+                    "OleInitialize() returned %#x (first dialog %#x)\n", hr, first_dlg);
+            OleUninitialize();
+            first_dlg = FALSE;
+        }
+    }
+
+    return CallNextHookEx(NULL, code, wp, lp);
+}
+
+static void test_ole_initialization(void)
+{
+    char file[MAX_PATH] = {0};
+    OPENFILENAMEA ofn = {0};
+    HRESULT hr;
+    HHOOK hook;
+    BOOL ret;
+
+    hook = SetWindowsHookExW(WH_CBT, hook_proc, NULL, GetCurrentThreadId());
+
+    ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400A;
+    ofn.lpstrFile = file;
+    ofn.nMaxFile = MAX_PATH;
+    ofn.lpfnHook = test_ole_init_wndproc;
+    ofn.Flags = OFN_ENABLEHOOK | OFN_EXPLORER;
+    ofn.hInstance = GetModuleHandleA(NULL);
+    ret = GetOpenFileNameA(&ofn);
+    ok(!ret, "GetOpenFileNameA returned %#x\n", ret);
+
+    hr = OleInitialize(NULL);
+    ok(hr == S_OK, "OleInitialize() returned %#x\n", hr);
+    OleUninitialize();
+
+    UnhookWindowsHookEx(hook);
+}
+
 START_TEST(filedlg)
 {
     test_DialogCancel();
@@ -1280,4 +1348,5 @@ START_TEST(filedlg)
     test_extension();
     test_null_filename();
     test_directory_filename();
+    test_ole_initialization();
 }




More information about the wine-cvs mailing list