1 /* 2 * PROJECT: ReactOS API tests 3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) 4 * PURPOSE: Test for RealShellExecuteExA/W 5 * COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com) 6 */ 7 8 #include "shelltest.h" 9 #include "closewnd.h" 10 #include <versionhelpers.h> 11 12 BOOL IsWindowsServer2003SP2OrGreater(void) 13 { 14 return IsWindowsVersionOrGreater(5, 2, 2); 15 } 16 17 typedef HINSTANCE (WINAPI *FN_RealShellExecuteExA)( 18 _In_opt_ HWND hwnd, 19 _In_opt_ LPCSTR lpOperation, 20 _In_opt_ LPCSTR lpFile, 21 _In_opt_ LPCSTR lpParameters, 22 _In_opt_ LPCSTR lpDirectory, 23 _In_opt_ LPSTR lpReturn, 24 _In_opt_ LPCSTR lpTitle, 25 _In_opt_ LPVOID lpReserved, 26 _In_ INT nCmdShow, 27 _Out_opt_ PHANDLE lphProcess, 28 _In_ DWORD dwFlags); 29 30 typedef HINSTANCE (WINAPI *FN_RealShellExecuteExW)( 31 _In_opt_ HWND hwnd, 32 _In_opt_ LPCWSTR lpOperation, 33 _In_opt_ LPCWSTR lpFile, 34 _In_opt_ LPCWSTR lpParameters, 35 _In_opt_ LPCWSTR lpDirectory, 36 _In_opt_ LPWSTR lpReturn, 37 _In_opt_ LPCWSTR lpTitle, 38 _In_opt_ LPVOID lpReserved, 39 _In_ INT nCmdShow, 40 _Out_opt_ PHANDLE lphProcess, 41 _In_ DWORD dwFlags); 42 43 static HINSTANCE s_hSHELL32 = NULL; 44 static FN_RealShellExecuteExA s_fnRealShellExecuteExA = NULL; 45 static FN_RealShellExecuteExW s_fnRealShellExecuteExW = NULL; 46 47 static WINDOW_LIST s_List1, s_List2; 48 49 static void TEST_Start(void) 50 { 51 GetWindowList(&s_List1); 52 } 53 54 static void TEST_End(void) 55 { 56 Sleep(500); 57 GetWindowList(&s_List2); 58 CloseNewWindows(&s_List1, &s_List2); 59 FreeWindowList(&s_List1); 60 FreeWindowList(&s_List2); 61 } 62 63 static void TEST_RealShellExecuteExA(void) 64 { 65 TEST_Start(); 66 67 INT_PTR ret; 68 69 ret = (INT_PTR)s_fnRealShellExecuteExA( 70 NULL, 71 NULL, 72 "notepad.exe", 73 NULL, 74 NULL, 75 NULL, 76 NULL, 77 NULL, 78 SW_SHOWDEFAULT, 79 NULL, 80 0); 81 if (IsWindowsServer2003SP2OrGreater()) 82 ok_long((LONG)ret, 42); 83 else 84 ok_long((LONG)ret, 2); 85 86 TEST_End(); 87 } 88 89 static void TEST_RealShellExecuteExW(void) 90 { 91 TEST_Start(); 92 93 INT_PTR ret; 94 95 ret = (INT_PTR)s_fnRealShellExecuteExW( 96 NULL, 97 NULL, 98 L"notepad.exe", 99 NULL, 100 NULL, 101 NULL, 102 NULL, 103 NULL, 104 SW_SHOWDEFAULT, 105 NULL, 106 0); 107 ok_long((LONG)ret, 42); 108 109 TEST_End(); 110 } 111 112 START_TEST(RealShellExecuteEx) 113 { 114 if (IsWindowsVistaOrGreater()) 115 { 116 skip("Vista+\n"); 117 return; 118 } 119 120 s_hSHELL32 = LoadLibraryW(L"shell32.dll"); 121 122 s_fnRealShellExecuteExA = (FN_RealShellExecuteExA)GetProcAddress(s_hSHELL32, MAKEINTRESOURCEA(266)); 123 s_fnRealShellExecuteExW = (FN_RealShellExecuteExW)GetProcAddress(s_hSHELL32, MAKEINTRESOURCEA(267)); 124 125 if (!s_fnRealShellExecuteExA || !s_fnRealShellExecuteExW) 126 { 127 skip("RealShellExecuteExA/W not found: %p, %p\n", 128 s_fnRealShellExecuteExA, s_fnRealShellExecuteExW); 129 return; 130 } 131 132 TEST_RealShellExecuteExA(); 133 TEST_RealShellExecuteExW(); 134 135 FreeLibrary(s_hSHELL32); 136 } 137