https://git.reactos.org/?p=reactos.git;a=commitdiff;h=b4b0728684abc0275ac87…
commit b4b0728684abc0275ac87160320dd08c0dc27458
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Sun Feb 23 16:10:26 2020 +0100
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Sun Feb 23 16:51:58 2020 +0100
[ATL30] Addendum to commit e410a122: Import Wine upstream patch
https://github.com/wine-mirror/wine/commit/5608682dc9c0f30cca0bfb24705e9b82…
atl: Fix the ATL_WNDCLASSINFOW::m_szAutoName member definition and construction.
Signed-off-by: Hermes Belusca-Maito <hermes.belusca(a)sfr.fr>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
---
dll/win32/atl/atl30.c | 15 ++++------
modules/rostests/winetests/atl/module.c | 51 +++++++++++++++++++++++++++++++++
sdk/include/reactos/wine/atlwin.h | 12 ++------
3 files changed, 58 insertions(+), 20 deletions(-)
diff --git a/dll/win32/atl/atl30.c b/dll/win32/atl/atl30.c
index 254dbadb084..5d5cd52b616 100644
--- a/dll/win32/atl/atl30.c
+++ b/dll/win32/atl/atl30.c
@@ -313,11 +313,7 @@ ATOM WINAPI AtlModuleRegisterWndClassInfoA(_ATL_MODULEA *pm,
_ATL_WNDCLASSINFOA
if (!wci->m_wc.lpszClassName)
{
-#ifdef __REACTOS__
sprintf(wci->m_szAutoName, "ATL:%p", wci);
-#else
- sprintf(wci->m_szAutoName, "ATL%08lx", (UINT_PTR)wci);
-#endif
TRACE("auto-generated class name %s\n", wci->m_szAutoName);
wci->m_wc.lpszClassName = wci->m_szAutoName;
}
@@ -354,8 +350,8 @@ ATOM WINAPI AtlModuleRegisterWndClassInfoA(_ATL_MODULEA *pm,
_ATL_WNDCLASSINFOA
* NOTES
* Can be called multiple times without error, unlike RegisterClassEx().
*
- * If the class name is NULL, then a class with a name of "ATLxxxxxxxx" is
- * registered, where the 'x's represent a unique value.
+ * If the class name is NULL, then a class with a name of "ATL:xxxxxxxx" is
+ * registered, where 'xxxxxxxx' represents a unique hexadecimal value.
*
*/
ATOM WINAPI AtlModuleRegisterWndClassInfoW(_ATL_MODULEW *pm, _ATL_WNDCLASSINFOW *wci,
WNDPROC *pProc)
@@ -376,12 +372,11 @@ ATOM WINAPI AtlModuleRegisterWndClassInfoW(_ATL_MODULEW *pm,
_ATL_WNDCLASSINFOW
if (!wci->m_wc.lpszClassName)
{
-#ifdef __REACTOS__
- static const WCHAR szFormat[] =
{'A','T','L',':','%','p',0};
+#ifndef __REACTOS__
+ swprintf(wci->m_szAutoName, ARRAY_SIZE(wci->m_szAutoName),
L"ATL:%p", wci);
#else
- static const WCHAR szFormat[] =
{'A','T','L','%','0','8','l','x',0};
+ swprintf(wci->m_szAutoName, L"ATL:%p", wci);
#endif
- swprintf(wci->m_szAutoName, szFormat, (UINT_PTR)wci);
TRACE("auto-generated class name %s\n",
debugstr_w(wci->m_szAutoName));
wci->m_wc.lpszClassName = wci->m_szAutoName;
}
diff --git a/modules/rostests/winetests/atl/module.c
b/modules/rostests/winetests/atl/module.c
index 44aecf04577..f176d070b3c 100644
--- a/modules/rostests/winetests/atl/module.c
+++ b/modules/rostests/winetests/atl/module.c
@@ -25,6 +25,7 @@
#define COBJMACROS
#include <wine/atlbase.h>
+#include <wine/atlwin.h>
#include <wine/test.h>
@@ -113,6 +114,55 @@ static void test_winmodule(void)
ok(winmod.m_pCreateWndList == create_data+1, "winmod.m_pCreateWndList !=
create_data\n");
}
+static void test_winclassinfo(void)
+{
+ _ATL_MODULEW winmod;
+ HRESULT hres;
+ int len, expectedLen;
+ ATOM atom;
+ WNDPROC wndProc;
+ _ATL_WNDCLASSINFOW wci =
+ {
+ /* .m_wc = */
+ {
+ sizeof(WNDCLASSEXW),
+ CS_VREDRAW | CS_HREDRAW,
+ DefWindowProcW,
+ 0,
+ 0,
+ NULL,
+ NULL,
+ LoadCursorW(NULL, (LPCWSTR)IDC_ARROW),
+ (HBRUSH)(COLOR_BTNFACE + 1),
+ NULL,
+ NULL, /* LPCSTR lpszClassName; <-- We force ATL class name generation
*/
+ NULL
+ },
+ /* .m_lpszOrigName = */ NULL,
+ /* .pWndProc = */ NULL,
+ /* .m_lpszCursorID = */ (LPCWSTR)IDC_ARROW,
+ /* .m_bSystemCursor = */ TRUE,
+ /* .m_atom = */ 0,
+ /* .m_szAutoName = */ L""
+ };
+
+ winmod.cbSize = sizeof(winmod);
+ winmod.m_pCreateWndList = (void*)0xdeadbeef;
+ hres = AtlModuleInit(&winmod, NULL, NULL);
+ ok(hres == S_OK, "AtlModuleInit failed: %08x\n", hres);
+ ok(!winmod.m_pCreateWndList, "winmod.m_pCreateWndList = %p\n",
winmod.m_pCreateWndList);
+
+ atom = AtlModuleRegisterWndClassInfoW(&winmod, &wci, &wndProc);
+ ok(atom, "AtlModuleRegisterWndClassInfoA failed: %08x\n", atom);
+ ok(atom == wci.m_atom, "(atom = %08x) is != than (wci.m_atom = %08x)\n",
atom, wci.m_atom);
+
+ ok(wcsncmp(wci.m_szAutoName, L"ATL:", 4) == 0, "wci.m_szAutoName =
'%ls', expected starting with 'ATL:'\n", wci.m_szAutoName);
+
+ len = wcslen(wci.m_szAutoName);
+ expectedLen = sizeof("ATL:") + sizeof(void *) * 2 - 1;
+ ok(len == expectedLen, "wci.m_szAutoName has length %d, expected length
%d\n", len, expectedLen);
+}
+
static DWORD cb_val;
static void WINAPI term_callback(DWORD dw)
@@ -156,5 +206,6 @@ START_TEST(module)
{
test_StructSize();
test_winmodule();
+ test_winclassinfo();
test_term();
}
diff --git a/sdk/include/reactos/wine/atlwin.h b/sdk/include/reactos/wine/atlwin.h
index 099f48bcb52..de31f403ba7 100644
--- a/sdk/include/reactos/wine/atlwin.h
+++ b/sdk/include/reactos/wine/atlwin.h
@@ -29,11 +29,7 @@ typedef struct _ATL_WNDCLASSINFOA_TAG
LPCSTR m_lpszCursorID;
BOOL m_bSystemCursor;
ATOM m_atom;
-#ifdef __REACTOS__
- CHAR m_szAutoName[sizeof("ATL:") + sizeof(void *) * 2]; // == 4 characters
+ NULL + number of hexadecimal digits describing a pointer.
-#else
- CHAR m_szAutoName[14];
-#endif
+ CHAR m_szAutoName[sizeof("ATL:") + sizeof(void *) * 2];
} _ATL_WNDCLASSINFOA;
typedef struct _ATL_WNDCLASSINFOW_TAG
@@ -44,11 +40,7 @@ typedef struct _ATL_WNDCLASSINFOW_TAG
LPCWSTR m_lpszCursorID;
BOOL m_bSystemCursor;
ATOM m_atom;
-#ifdef __REACTOS__
- WCHAR m_szAutoName[sizeof("ATL:") + sizeof(void *) * 2]; // == 4 characters
+ NULL + number of hexadecimal digits describing a pointer.
-#else
- WCHAR m_szAutoName[14];
-#endif
+ WCHAR m_szAutoName[sizeof("ATL:") + sizeof(void *) * 2];
} _ATL_WNDCLASSINFOW;
ATOM WINAPI AtlModuleRegisterWndClassInfoA(_ATL_MODULEA *pm, _ATL_WNDCLASSINFOA *wci,
WNDPROC *pProc);