2 * PROJECT: ReactOS API tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for OpenAs_RunDLL
5 * PROGRAMMERS: Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
13 typedef void (WINAPI
*OPENAS_RUNDLLA
)(HWND
, HINSTANCE
, LPCSTR
, int);
15 typedef void (WINAPI
*OPENAS_RUNDLLW
)(HWND
, HINSTANCE
, LPCWSTR
, int);
17 static OPENAS_RUNDLLA pOpenAs_RunDLLA
= NULL
;
18 static OPENAS_RUNDLLW pOpenAs_RunDLLW
= NULL
;
39 #define BAD_INST ((HINSTANCE)0xDEAD)
40 #define BAD_SZ_A ((LPCSTR)0xDEAD)
41 #define BAD_SZ_W ((LPCWSTR)0xDEAD)
43 static const TEST_ENTRY s_TestEntries
[] =
46 {__LINE__
, FALSE
, NULL
, OPENED
, FALSE
, NULL
, NULL
, 0 },
47 {__LINE__
, FALSE
, NULL
, OPENED
, FALSE
, "", NULL
, 0 },
48 {__LINE__
, FALSE
, NULL
, OPENED
, FALSE
, "invalid file name.txt", NULL
, 0 },
49 {__LINE__
, FALSE
, NULL
, DEATH
, FALSE
, BAD_SZ_A
, NULL
, 0 },
50 {__LINE__
, FALSE
, NULL
, OPENED
, TRUE
, "created file.txt", NULL
, 0 },
51 {__LINE__
, FALSE
, BAD_INST
, OPENED
, FALSE
, NULL
, NULL
, 0 },
52 {__LINE__
, FALSE
, BAD_INST
, OPENED
, FALSE
, "invalid file name.txt", NULL
, 0 },
53 {__LINE__
, FALSE
, BAD_INST
, DEATH
, FALSE
, BAD_SZ_A
, NULL
, 0xDEADFACE },
54 {__LINE__
, FALSE
, BAD_INST
, OPENED
, TRUE
, "created file.txt", NULL
, 0 },
56 {__LINE__
, TRUE
, NULL
, OPENED
, FALSE
, NULL
, NULL
, 0x80070490 },
57 {__LINE__
, TRUE
, NULL
, OPENED
, FALSE
, NULL
, L
"", ERROR_NO_SCROLLBARS
},
58 {__LINE__
, TRUE
, NULL
, OPENED
, FALSE
, NULL
, L
"invalid file name.txt", ERROR_NO_SCROLLBARS
},
59 {__LINE__
, TRUE
, NULL
, OPENED
, FALSE
, NULL
, BAD_SZ_W
, 0xDEADFACE },
60 {__LINE__
, TRUE
, NULL
, OPENED
, TRUE
, NULL
, L
"created file.txt", ERROR_NO_SCROLLBARS
},
61 {__LINE__
, TRUE
, BAD_INST
, OPENED
, FALSE
, NULL
, NULL
, 0x80070490 },
62 {__LINE__
, TRUE
, BAD_INST
, OPENED
, FALSE
, NULL
, L
"invalid file name.txt", ERROR_NO_SCROLLBARS
},
63 {__LINE__
, TRUE
, BAD_INST
, OPENED
, FALSE
, NULL
, BAD_SZ_W
, 0xDEADFACE },
64 {__LINE__
, TRUE
, BAD_INST
, OPENED
, TRUE
, NULL
, L
"created file.txt", ERROR_NO_SCROLLBARS
},
67 static HANDLE s_hThread
= NULL
;
68 static INT s_nRet
= NOT_OPENED
;
70 static unsigned __stdcall
71 watch_thread_proc(void *arg
)
73 for (int i
= 0; i
< COUNT
; ++i
)
77 HWND hwnd
= FindWindowA("#32770", "Open With");
81 if (!IsWindowVisible(hwnd
))
83 trace("not visible\n");
88 PostMessage(hwnd
, WM_COMMAND
, MAKEWPARAM(IDCANCEL
, BN_CLICKED
), 0);
94 static void StartWatchGUI(const TEST_ENTRY
*pEntry
)
97 s_hThread
= (HANDLE
)_beginthreadex(NULL
, 0, watch_thread_proc
, NULL
, 0, NULL
);
100 static void DoEntry(const TEST_ENTRY
*pEntry
)
104 if (pEntry
->bCreateFile
)
106 FILE *fp
= _wfopen(pEntry
->pszFileW
, L
"wb");
107 ok(fp
!= NULL
, "Line %d: Unable to create file '%s'\n", pEntry
->nLine
, wine_dbgstr_w(pEntry
->pszFileW
));
111 StartWatchGUI(pEntry
);
112 SetLastError(0xDEADFACE);
116 (*pOpenAs_RunDLLW
)(NULL
, pEntry
->hInst
, pEntry
->pszFileW
, SW_SHOWDEFAULT
);
118 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
124 DWORD dwError
= GetLastError();
125 ok(pEntry
->dwError
== dwError
, "Line %d: error expected %ld, was %ld\n", pEntry
->nLine
, pEntry
->dwError
, dwError
);
127 WaitForSingleObject(s_hThread
, INFINITE
);
128 CloseHandle(s_hThread
);
130 if (pEntry
->bCreateFile
)
132 ok(DeleteFileW(pEntry
->pszFileW
), "Line %d: DeleteFileA failed\n", pEntry
->nLine
);
137 if (pEntry
->bCreateFile
)
139 FILE *fp
= fopen(pEntry
->pszFileA
, "wb");
140 ok(fp
!= NULL
, "Line %d: Unable to create file '%s'\n", pEntry
->nLine
, pEntry
->pszFileA
);
144 StartWatchGUI(pEntry
);
145 SetLastError(0xDEADFACE);
149 (*pOpenAs_RunDLLA
)(NULL
, pEntry
->hInst
, pEntry
->pszFileA
, SW_SHOWDEFAULT
);
151 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
157 DWORD dwError
= GetLastError();
158 ok(pEntry
->dwError
== dwError
, "Line %d: error expected %ld, was %ld\n", pEntry
->nLine
, pEntry
->dwError
, dwError
);
160 WaitForSingleObject(s_hThread
, INFINITE
);
161 CloseHandle(s_hThread
);
163 if (pEntry
->bCreateFile
)
165 ok(DeleteFileA(pEntry
->pszFileA
), "Line %d: DeleteFileA failed\n", pEntry
->nLine
);
169 // FIXME: This function probably returns void
170 //ok(pEntry->nRet == s_nRet, "Line %d: s_nRet expected %d, was %d\n", pEntry->nLine, pEntry->nRet, s_nRet);
173 START_TEST(OpenAs_RunDLL
)
175 HINSTANCE hShell32
= LoadLibraryA("shell32.dll");
176 if (hShell32
== NULL
)
178 skip("Unable to load shell32.dll\n");
182 pOpenAs_RunDLLA
= (OPENAS_RUNDLLA
)GetProcAddress(hShell32
, "OpenAs_RunDLLA");
183 if (pOpenAs_RunDLLA
== NULL
)
185 skip("Unable to get OpenAs_RunDLLA\n");
189 pOpenAs_RunDLLW
= (OPENAS_RUNDLLW
)GetProcAddress(hShell32
, "OpenAs_RunDLLW");
190 if (pOpenAs_RunDLLW
== NULL
)
192 skip("Unable to get OpenAs_RunDLLW\n");
196 TCHAR szCurDir
[MAX_PATH
], szTempDir
[MAX_PATH
];
198 ok(GetCurrentDirectory(_countof(szCurDir
), szCurDir
), "GetCurrentDirectory failed\n");
199 ok(GetTempPath(_countof(szTempDir
), szTempDir
), "GetTempPath failed\n");
201 if (!SetCurrentDirectory(szTempDir
))
203 skip("SetCurrentDirectory failed\n");
207 for (size_t i
= 0; i
< _countof(s_TestEntries
); ++i
)
209 const TEST_ENTRY
*pEntry
= &s_TestEntries
[i
];
213 ok(SetCurrentDirectory(szCurDir
), "SetCurrentDirectory failed\n");
216 FreeLibrary(hShell32
);