https://git.reactos.org/?p=reactos.git;a=commitdiff;h=aa52c3f5ebb588adbf710…
commit aa52c3f5ebb588adbf710310dcb9dd5bfb3a3ba6
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Mon Jan 20 08:32:07 2025 +0900
Commit: GitHub <noreply(a)github.com>
CommitDate: Mon Jan 20 08:32:07 2025 +0900
[SHELL32][SHELL32_APITEST][SDK] Implement SHEnumerateUnreadMailAccountsW (#7619)
Implementing missing features...
JIRA issue: CORE-19278
- Move function definition from stubs.cpp into utils.cpp.
- Add prototype to <shellapi.h>.
---
dll/win32/shell32/stubs.cpp | 15 ----------
dll/win32/shell32/utils.cpp | 33 ++++++++++++++++++++++
modules/rostests/apitests/shell32/CMakeLists.txt | 1 +
.../shell32/SHEnumerateUnreadMailAccountsW.cpp | 33 ++++++++++++++++++++++
modules/rostests/apitests/shell32/testlist.c | 2 ++
sdk/include/psdk/shellapi.h | 7 +++++
6 files changed, 76 insertions(+), 15 deletions(-)
diff --git a/dll/win32/shell32/stubs.cpp b/dll/win32/shell32/stubs.cpp
index 70918f6f18a..8967dd49ab8 100644
--- a/dll/win32/shell32/stubs.cpp
+++ b/dll/win32/shell32/stubs.cpp
@@ -30,21 +30,6 @@ SHGetUnreadMailCountW(HKEY hKeyUser,
return E_FAIL;
}
-/*
- * Unimplemented
- */
-EXTERN_C HRESULT
-WINAPI
-SHEnumerateUnreadMailAccountsW(HKEY user,
- DWORD idx,
- LPWSTR mailaddress,
- INT mailaddresslen)
-{
- FIXME("SHEnumerateUnreadMailAccountsW(%p %d %p %d) stub\n",
- user, idx, mailaddress, mailaddresslen);
- return E_NOTIMPL;
-}
-
/*
* Unimplemented
*/
diff --git a/dll/win32/shell32/utils.cpp b/dll/win32/shell32/utils.cpp
index 391acbd8461..1f4ff07a88e 100644
--- a/dll/win32/shell32/utils.cpp
+++ b/dll/win32/shell32/utils.cpp
@@ -901,6 +901,39 @@ SheRemoveQuotesW(LPWSTR psz)
return psz;
}
+/*************************************************************************
+ * SHEnumerateUnreadMailAccountsW [SHELL32.287]
+ *
+ * @see
https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-sh…
+ */
+EXTERN_C
+HRESULT WINAPI
+SHEnumerateUnreadMailAccountsW(
+ _In_opt_ HKEY hKeyUser,
+ _In_ DWORD dwIndex,
+ _Out_writes_(cchMailAddress) PWSTR pszMailAddress,
+ _In_ INT cchMailAddress)
+{
+ if (!hKeyUser)
+ hKeyUser = HKEY_CURRENT_USER;
+
+ HKEY hKey;
+ LSTATUS error = RegOpenKeyExW(hKeyUser,
+
L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail",
+ 0, KEY_ENUMERATE_SUB_KEYS, &hKey);
+ if (error)
+ return HRESULT_FROM_WIN32(error);
+
+ FILETIME FileTime;
+ error = RegEnumKeyExW(hKey, dwIndex, pszMailAddress, (PDWORD)&cchMailAddress,
NULL, NULL,
+ NULL, &FileTime);
+ if (error)
+ *pszMailAddress = UNICODE_NULL;
+
+ RegCloseKey(hKey);
+ return error ? HRESULT_FROM_WIN32(error) : S_OK;
+}
+
/*************************************************************************
* SHFindComputer [SHELL32.91]
*
diff --git a/modules/rostests/apitests/shell32/CMakeLists.txt
b/modules/rostests/apitests/shell32/CMakeLists.txt
index 7a7b523a68d..aff71a65c90 100644
--- a/modules/rostests/apitests/shell32/CMakeLists.txt
+++ b/modules/rostests/apitests/shell32/CMakeLists.txt
@@ -34,6 +34,7 @@ list(APPEND SOURCE
SHParseDisplayName.cpp
SHRestricted.cpp
SHShouldShowWizards.cpp
+ SHEnumerateUnreadMailAccountsW.cpp
She.cpp
ShellExec_RunDLL.cpp
ShellExecCmdLine.cpp
diff --git a/modules/rostests/apitests/shell32/SHEnumerateUnreadMailAccountsW.cpp
b/modules/rostests/apitests/shell32/SHEnumerateUnreadMailAccountsW.cpp
new file mode 100644
index 00000000000..5abc2df9a44
--- /dev/null
+++ b/modules/rostests/apitests/shell32/SHEnumerateUnreadMailAccountsW.cpp
@@ -0,0 +1,33 @@
+/*
+ * PROJECT: ReactOS API tests
+ * LICENSE: GPL-2.0+ (
https://spdx.org/licenses/GPL-2.0+)
+ * PURPOSE: Test for SHEnumerateUnreadMailAccountsW
+ * COPYRIGHT: Copyright 2025 Katayama Hirofumi MZ (katayama.hirofumi.mz(a)gmail.com)
+ */
+
+#include "shelltest.h"
+
+START_TEST(SHEnumerateUnreadMailAccountsW)
+{
+ HRESULT hr;
+ WCHAR szMailAddress[MAX_PATH];
+ HKEY hKey;
+ LSTATUS error;
+ DWORD dwDisposition;
+
+ error = RegCreateKeyExW(HKEY_CURRENT_USER,
+
L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail\\example.com",
+ 0, NULL, 0, KEY_WRITE, NULL, &hKey, &dwDisposition);
+ ok_long(error, ERROR_SUCCESS);
+
+ szMailAddress[0] = UNICODE_NULL;
+ hr = SHEnumerateUnreadMailAccountsW(NULL, 0, szMailAddress,
_countof(szMailAddress));
+ ok_hex(hr, S_OK);
+ ok(szMailAddress[0] != UNICODE_NULL, "szMailAddress was empty\n");
+
+ if (dwDisposition == REG_CREATED_NEW_KEY)
+ {
+ RegDeleteKeyW(HKEY_CURRENT_USER,
+
L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail\\example.com");
+ }
+}
diff --git a/modules/rostests/apitests/shell32/testlist.c
b/modules/rostests/apitests/shell32/testlist.c
index d98d529c6fb..daa699a8e32 100644
--- a/modules/rostests/apitests/shell32/testlist.c
+++ b/modules/rostests/apitests/shell32/testlist.c
@@ -34,6 +34,7 @@ extern void func_SHChangeNotify(void);
extern void func_SHCreateDataObject(void);
extern void func_SHCreateFileDataObject(void);
extern void func_SHCreateFileExtractIconW(void);
+extern void func_SHEnumerateUnreadMailAccountsW(void);
extern void func_She(void);
extern void func_ShellExec_RunDLL(void);
extern void func_ShellExecCmdLine(void);
@@ -84,6 +85,7 @@ const struct test winetest_testlist[] =
{ "SHCreateDataObject", func_SHCreateDataObject },
{ "SHCreateFileDataObject", func_SHCreateFileDataObject },
{ "SHCreateFileExtractIconW", func_SHCreateFileExtractIconW },
+ { "SHEnumerateUnreadMailAccountsW", func_SHEnumerateUnreadMailAccountsW },
{ "She", func_She },
{ "ShellExec_RunDLL", func_ShellExec_RunDLL },
{ "ShellExecCmdLine", func_ShellExecCmdLine },
diff --git a/sdk/include/psdk/shellapi.h b/sdk/include/psdk/shellapi.h
index eeda59cfcfb..b707d6d41df 100644
--- a/sdk/include/psdk/shellapi.h
+++ b/sdk/include/psdk/shellapi.h
@@ -652,6 +652,13 @@ SHTestTokenMembership(
_In_ ULONG ulRID);
#endif
+HRESULT WINAPI
+SHEnumerateUnreadMailAccountsW(
+ _In_opt_ HKEY hKeyUser,
+ _In_ DWORD dwIndex,
+ _Out_writes_(cchMailAddress) PWSTR pszMailAddress,
+ _In_ INT cchMailAddress);
+
#ifdef UNICODE
#define NOTIFYICONDATA_V1_SIZE NOTIFYICONDATAW_V1_SIZE
#define NOTIFYICONDATA_V2_SIZE NOTIFYICONDATAW_V2_SIZE