Author: mjansen Date: Wed Nov 9 22:13:26 2016 New Revision: 73180
URL: http://svn.reactos.org/svn/reactos?rev=73180&view=rev Log: [SHELL32_APITEST] Add some tests for ShellExecuteEx showing extension completion with the App Paths registry key. Patch by Yaroslav Veremenko. CORE-12049
Added: trunk/rostests/apitests/shell32/shlexec.cpp (with props) Modified: trunk/rostests/apitests/shell32/CMakeLists.txt trunk/rostests/apitests/shell32/testlist.c
Modified: trunk/rostests/apitests/shell32/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/shell32/CMakeList... ============================================================================== --- trunk/rostests/apitests/shell32/CMakeLists.txt [iso-8859-1] (original) +++ trunk/rostests/apitests/shell32/CMakeLists.txt [iso-8859-1] Wed Nov 9 22:13:26 2016 @@ -10,8 +10,9 @@ menu.cpp shelltest.cpp SHParseDisplayName.cpp + shlexec.cpp testlist.c) target_link_libraries(shell32_apitest wine uuid ${PSEH_LIB}) set_module_type(shell32_apitest win32cui) -add_importlibs(shell32_apitest user32 gdi32 shell32 ole32 oleaut32 shlwapi msvcrt kernel32 ntdll) +add_importlibs(shell32_apitest user32 gdi32 shell32 ole32 oleaut32 advapi32 shlwapi msvcrt kernel32 ntdll) add_cd_file(TARGET shell32_apitest DESTINATION reactos/bin FOR all)
Added: trunk/rostests/apitests/shell32/shlexec.cpp URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/shell32/shlexec.c... ============================================================================== --- trunk/rostests/apitests/shell32/shlexec.cpp (added) +++ trunk/rostests/apitests/shell32/shlexec.cpp [iso-8859-1] Wed Nov 9 22:13:26 2016 @@ -0,0 +1,105 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: GPLv2+ - See COPYING in the top level directory + * PURPOSE: Testing ShellExecuteEx + * PROGRAMMER: Yaroslav Veremenko yaroslav@veremenko.info + */ + + +#include "shelltest.h" + + + +#define ok_ShellExecuteEx (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : TestShellExecuteEx + +static +BOOL +CreateAppPathRegKey(const WCHAR* Name) +{ + HKEY RegistryKey; + LONG Result; + WCHAR Buffer[1024]; + WCHAR KeyValue[1024]; + DWORD Length = sizeof(KeyValue); + DWORD Disposition; + + wcscpy(Buffer, L"Software\Microsoft\Windows\CurrentVersion\App Paths\"); + wcscat(Buffer, L"IEXPLORE.EXE"); + Result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, Buffer, 0, KEY_READ, &RegistryKey); + if (Result != ERROR_SUCCESS) trace("Could not open iexplore.exe key. Status: %d\n", Result); + if (Result) goto end; + Result = RegQueryValueExW(RegistryKey, NULL, NULL, NULL, (LPBYTE)KeyValue, &Length); + if (Result != ERROR_SUCCESS) trace("Could not read iexplore.exe key. Status: %d\n", Result); + if (Result) goto end; + RegCloseKey(RegistryKey); + + wcscpy(Buffer, L"Software\Microsoft\Windows\CurrentVersion\App Paths\"); + wcscat(Buffer, Name); + Result = RegCreateKeyExW(HKEY_LOCAL_MACHINE, Buffer, 0, NULL, + 0, KEY_WRITE, NULL, &RegistryKey, &Disposition); + if (Result != ERROR_SUCCESS) trace("Could not create test key. Status: %d\n", Result); + if (Result) goto end; + Result = RegSetValueW(RegistryKey, NULL, REG_SZ, KeyValue, 0); + if (Result != ERROR_SUCCESS) trace("Could not set value of the test key. Status: %d\n", Result); + if (Result) goto end; + RegCloseKey(RegistryKey); +end: + if (RegistryKey) RegCloseKey(RegistryKey); + return Result == ERROR_SUCCESS; +} + +static +VOID +DeleteAppPathRegKey(const WCHAR* Name) +{ + LONG Result; + WCHAR Buffer[1024]; + wcscpy(Buffer, L"Software\Microsoft\Windows\CurrentVersion\App Paths\"); + wcscat(Buffer, Name); + Result = RegDeleteKeyW(HKEY_LOCAL_MACHINE, Buffer); + if (Result != ERROR_SUCCESS) trace("Could not remove the test key. Status: %d\n", Result); +} + +static +VOID +TestShellExecuteEx(const WCHAR* Name, BOOL ExpectedResult) +{ + SHELLEXECUTEINFOW ShellExecInfo; + BOOL Result; + ZeroMemory(&ShellExecInfo, sizeof(ShellExecInfo)); + ShellExecInfo.cbSize = sizeof(ShellExecInfo); + ShellExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI; + ShellExecInfo.hwnd = NULL; + ShellExecInfo.nShow = SW_SHOWNORMAL; + ShellExecInfo.lpFile = Name; + ShellExecInfo.lpDirectory = NULL; + Result = ShellExecuteExW(&ShellExecInfo); + ok(Result == ExpectedResult, "ShellExecuteEx lpFile %s failed. Error: %d\n", wine_dbgstr_w(Name), GetLastError()); + if (ShellExecInfo.hProcess) + { + Result = TerminateProcess(ShellExecInfo.hProcess, 0); + if (!Result) trace("Terminate process failed. Error: %d\n", GetLastError()); + WaitForSingleObject(ShellExecInfo.hProcess, INFINITE); + CloseHandle(ShellExecInfo.hProcess); + } +} + +START_TEST(shlexec) +{ + ok_ShellExecuteEx(L"iexplore", TRUE); + ok_ShellExecuteEx(L"iexplore.exe", TRUE); + + if (CreateAppPathRegKey(L"iexplore.bat")) + { + ok_ShellExecuteEx(L"iexplore.bat", TRUE); + ok_ShellExecuteEx(L"iexplore.bat.exe", FALSE); + DeleteAppPathRegKey(L"iexplore.bat"); + } + + if (CreateAppPathRegKey(L"iexplore.bat.exe")) + { + ok_ShellExecuteEx(L"iexplore.bat", FALSE); + ok_ShellExecuteEx(L"iexplore.bat.exe", TRUE); + DeleteAppPathRegKey(L"iexplore.bat.exe"); + } +}
Propchange: trunk/rostests/apitests/shell32/shlexec.cpp ------------------------------------------------------------------------------ svn:eol-style = native
Modified: trunk/rostests/apitests/shell32/testlist.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/shell32/testlist.... ============================================================================== --- trunk/rostests/apitests/shell32/testlist.c [iso-8859-1] (original) +++ trunk/rostests/apitests/shell32/testlist.c [iso-8859-1] Wed Nov 9 22:13:26 2016 @@ -8,6 +8,7 @@ extern void func_CShellLink(void); extern void func_menu(void); extern void func_SHParseDisplayName(void); +extern void func_shlexec(void);
const struct test winetest_testlist[] = { @@ -16,5 +17,6 @@ { "CShellLink", func_CShellLink }, { "menu", func_menu }, { "SHParseDisplayName", func_SHParseDisplayName }, + { "shlexec", func_shlexec }, { 0, 0 } };