1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Tests for SHLoadRegUIStringA/W
5 * COPYRIGHT: Copyright 2023 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8 #include <apitest.h>
9 #include <shlwapi.h>
10
11 typedef HRESULT (WINAPI *FN_SHLoadRegUIStringA)(HKEY hkey, LPCSTR value, LPSTR buf, DWORD size);
12 typedef HRESULT (WINAPI *FN_SHLoadRegUIStringW)(HKEY hkey, LPCWSTR value, LPWSTR buf, DWORD size);
13
14 static FN_SHLoadRegUIStringA pSHLoadRegUIStringA = NULL;
15 static FN_SHLoadRegUIStringW pSHLoadRegUIStringW = NULL;
16
test_SHLoadRegUIStringA(HKEY hKey)17 static void test_SHLoadRegUIStringA(HKEY hKey)
18 {
19 HRESULT hr;
20 CHAR szBuff[MAX_PATH];
21
22 hr = pSHLoadRegUIStringA(hKey, "TestValue1", szBuff, _countof(szBuff));
23 ok_long(hr, S_OK);
24 ok_str(szBuff, "%WINDIR%\\TEST");
25
26 hr = pSHLoadRegUIStringA(hKey, "TestValue2", szBuff, _countof(szBuff));
27 ok_long(hr, S_OK);
28 ok_str(szBuff, "Test string one.");
29 }
30
test_SHLoadRegUIStringW(HKEY hKey)31 static void test_SHLoadRegUIStringW(HKEY hKey)
32 {
33 HRESULT hr;
34 WCHAR szBuff[MAX_PATH];
35
36 hr = pSHLoadRegUIStringW(hKey, L"TestValue1", szBuff, _countof(szBuff));
37 ok_long(hr, S_OK);
38 ok_wstr(szBuff, L"%WINDIR%\\TEST");
39
40 hr = pSHLoadRegUIStringW(hKey, L"TestValue2", szBuff, _countof(szBuff));
41 ok_long(hr, S_OK);
42 ok_wstr(szBuff, L"Test string one.");
43 }
44
45 BOOL extract_resource(const WCHAR* Filename, LPCWSTR ResourceName);
46
START_TEST(SHLoadRegUIString)47 START_TEST(SHLoadRegUIString)
48 {
49 LONG error;
50 HKEY hKey;
51 DWORD cbValue;
52 static const WCHAR s_szTestValue1[] = L"%WINDIR%\\TEST";
53 static const WCHAR s_szTestValue2[] = L"@SHLoadRegUIString.dll%EmptyEnvVar%,-3";
54 HMODULE hSHLWAPI;
55
56 SetEnvironmentVariableW(L"EmptyEnvVar", L"");
57
58 /* Get procedures */
59 hSHLWAPI = GetModuleHandleW(L"shlwapi");
60 pSHLoadRegUIStringA = (FN_SHLoadRegUIStringA)GetProcAddress(hSHLWAPI, (LPCSTR)438);
61 pSHLoadRegUIStringW = (FN_SHLoadRegUIStringW)GetProcAddress(hSHLWAPI, (LPCSTR)439);
62 if (!pSHLoadRegUIStringA || !pSHLoadRegUIStringW)
63 {
64 skip("No procedure found\n");
65 return;
66 }
67
68 if (!extract_resource(L"SHLoadRegUIString.dll", MAKEINTRESOURCEW(101)))
69 {
70 skip("File 'SHLoadRegUIString.dll' cannot be extracted\n");
71 return;
72 }
73
74 /* Open registry key and write some test values */
75 error = RegOpenKeyExW(HKEY_CURRENT_USER, L"Software", 0, KEY_READ | KEY_WRITE, &hKey);
76 ok_long(error, ERROR_SUCCESS);
77
78 cbValue = (lstrlenW(s_szTestValue1) + 1) * sizeof(WCHAR);
79 error = RegSetValueExW(hKey, L"TestValue1", 0, REG_SZ, (LPBYTE)s_szTestValue1, cbValue);
80 ok_long(error, ERROR_SUCCESS);
81
82 cbValue = (lstrlenW(s_szTestValue2) + 1) * sizeof(WCHAR);
83 error = RegSetValueExW(hKey, L"TestValue2", 0, REG_SZ, (LPBYTE)s_szTestValue2, cbValue);
84 ok_long(error, ERROR_SUCCESS);
85
86 /* The main dish */
87 test_SHLoadRegUIStringA(hKey);
88 test_SHLoadRegUIStringW(hKey);
89
90 /* Delete the test values and close the key */
91 RegDeleteValueW(hKey, L"TestValue1");
92 RegDeleteValueW(hKey, L"TestValue2");
93 RegCloseKey(hKey);
94
95 DeleteFileW(L"SHLoadRegUIString.dll");
96 }
97