aa7bbc72ae212f3b3fc85fce67b2d158e9a24d1a
[reactos.git] / modules / rostests / apitests / shell32 / ShellExecuteEx.cpp
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Testing ShellExecuteEx
5 * PROGRAMMER: Yaroslav Veremenko <yaroslav@veremenko.info>
6 */
7
8
9 #include "shelltest.h"
10
11
12
13 #define ok_ShellExecuteEx (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : TestShellExecuteEx
14
15 static
16 BOOL
17 CreateAppPathRegKey(const WCHAR* Name)
18 {
19 HKEY RegistryKey;
20 LONG Result;
21 WCHAR Buffer[1024];
22 WCHAR KeyValue[1024];
23 DWORD Length = sizeof(KeyValue);
24 DWORD Disposition;
25
26 wcscpy(Buffer, L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\");
27 wcscat(Buffer, L"IEXPLORE.EXE");
28 Result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, Buffer, 0, KEY_READ, &RegistryKey);
29 if (Result != ERROR_SUCCESS) trace("Could not open iexplore.exe key. Status: %lu\n", Result);
30 if (Result) goto end;
31 Result = RegQueryValueExW(RegistryKey, NULL, NULL, NULL, (LPBYTE)KeyValue, &Length);
32 if (Result != ERROR_SUCCESS) trace("Could not read iexplore.exe key. Status: %lu\n", Result);
33 if (Result) goto end;
34 RegCloseKey(RegistryKey);
35
36 wcscpy(Buffer, L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\");
37 wcscat(Buffer, Name);
38 Result = RegCreateKeyExW(HKEY_LOCAL_MACHINE, Buffer, 0, NULL,
39 0, KEY_WRITE, NULL, &RegistryKey, &Disposition);
40 if (Result != ERROR_SUCCESS) trace("Could not create test key. Status: %lu\n", Result);
41 if (Result) goto end;
42 Result = RegSetValueW(RegistryKey, NULL, REG_SZ, KeyValue, 0);
43 if (Result != ERROR_SUCCESS) trace("Could not set value of the test key. Status: %lu\n", Result);
44 if (Result) goto end;
45 RegCloseKey(RegistryKey);
46 end:
47 if (RegistryKey) RegCloseKey(RegistryKey);
48 return Result == ERROR_SUCCESS;
49 }
50
51 static
52 VOID
53 DeleteAppPathRegKey(const WCHAR* Name)
54 {
55 LONG Result;
56 WCHAR Buffer[1024];
57 wcscpy(Buffer, L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\");
58 wcscat(Buffer, Name);
59 Result = RegDeleteKeyW(HKEY_LOCAL_MACHINE, Buffer);
60 if (Result != ERROR_SUCCESS) trace("Could not remove the test key. Status: %lu\n", Result);
61 }
62
63 static
64 VOID
65 TestShellExecuteEx(const WCHAR* Name, BOOL ExpectedResult)
66 {
67 SHELLEXECUTEINFOW ShellExecInfo;
68 BOOL Result;
69 ZeroMemory(&ShellExecInfo, sizeof(ShellExecInfo));
70 ShellExecInfo.cbSize = sizeof(ShellExecInfo);
71 ShellExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
72 ShellExecInfo.hwnd = NULL;
73 ShellExecInfo.nShow = SW_SHOWNORMAL;
74 ShellExecInfo.lpFile = Name;
75 ShellExecInfo.lpDirectory = NULL;
76 Result = ShellExecuteExW(&ShellExecInfo);
77 ok(Result == ExpectedResult, "ShellExecuteEx lpFile %s failed. Error: %lu\n", wine_dbgstr_w(Name), GetLastError());
78 if (ShellExecInfo.hProcess)
79 {
80 Result = TerminateProcess(ShellExecInfo.hProcess, 0);
81 if (!Result) trace("Terminate process failed. Error: %lu\n", GetLastError());
82 WaitForSingleObject(ShellExecInfo.hProcess, INFINITE);
83 CloseHandle(ShellExecInfo.hProcess);
84 }
85 }
86
87 START_TEST(ShellExecuteEx)
88 {
89 ok_ShellExecuteEx(L"iexplore", TRUE);
90 ok_ShellExecuteEx(L"iexplore.exe", TRUE);
91
92 if (CreateAppPathRegKey(L"iexplore.bat"))
93 {
94 ok_ShellExecuteEx(L"iexplore.bat", TRUE);
95 ok_ShellExecuteEx(L"iexplore.bat.exe", FALSE);
96 DeleteAppPathRegKey(L"iexplore.bat");
97 }
98
99 if (CreateAppPathRegKey(L"iexplore.bat.exe"))
100 {
101 ok_ShellExecuteEx(L"iexplore.bat", FALSE);
102 ok_ShellExecuteEx(L"iexplore.bat.exe", TRUE);
103 DeleteAppPathRegKey(L"iexplore.bat.exe");
104 }
105 }