Author: akhaldi Date: Sun Mar 5 20:57:57 2017 New Revision: 74093
URL: http://svn.reactos.org/svn/reactos?rev=74093&view=rev Log: [COMDLG32_WINETEST] Sync with Wine Staging 2.2. CORE-12823
Modified: trunk/rostests/winetests/comdlg32/filedlg.c
Modified: trunk/rostests/winetests/comdlg32/filedlg.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/comdlg32/filedlg... ============================================================================== --- trunk/rostests/winetests/comdlg32/filedlg.c [iso-8859-1] (original) +++ trunk/rostests/winetests/comdlg32/filedlg.c [iso-8859-1] Sun Mar 5 20:57:57 2017 @@ -36,6 +36,9 @@ #include <shlguid.h> #define COBJMACROS #include <shobjidl.h> + +#include <ole2.h> +#include <reactos/undocuser.h>
/* ##### */
@@ -1274,6 +1277,73 @@ 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); + 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(); @@ -1288,4 +1358,5 @@ test_extension(); test_null_filename(); test_directory_filename(); -} + test_ole_initialization(); +}