[PATCH v2 1/2] comdlg32/tests: Add test for OLE initialization in file dialogs.
Józef Kucia
jkucia at codeweavers.com
Thu Feb 2 09:10:05 CST 2017
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
Version 2:
* Test OleInitialize() for all messages in OFNHookProc.
* Mark Vista+ behavior as broken().
---
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();
}
--
2.10.2
More information about the wine-patches
mailing list