https://git.reactos.org/?p=reactos.git;a=commitdiff;h=770bf93be372cfc78342e…
commit 770bf93be372cfc78342e7bbf11fb2e251ae591d
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Tue Feb 13 00:10:09 2018 +0100
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Tue Feb 13 00:13:47 2018 +0100
[SHLWAPI] Improvements for SHCreateWorkerWindowW/A() prototypes + fix x64-bit
compatibility. Sent upstream.
[SHLWAPI] Refactor the SHCreateWorkerWindowW() prototype to match its ANSI
SHCreateWorkerWindowA() counterpart.
The last parameter is really to be understood as an extra window data, and not a
"message result" (as it would be the case for dialog window procedure).
That is why I also remove the mention of "DWLP_MSGRESULT" in the
SetWindowLongPtrW() call.
SHCreateWorkerWindowA() had it OK but SHCreateWorkerWindowW() did not.
------------------
[SHLWAPI] Make SHCreateWorkerWindowA() and SHCreateWorkerWindowW() x64-compatible.
The first parameter of these functions is a pointer to a window procedure, having a
definite prototype, so employ a correct typedef WNDPROC,
which ensures both correct pointer size and parameter type enforcement.
This also ensures that we use instead a correct pointer size, since otherwise LONG
remains 32-bits for Windows compatibility on x64 platforms.
The wndProc parameter is thus casted to LONG_PTR to comply with the
SetWindowLongPtrA/W calls.
In SHCreateWorkerWindowW(), the last "wnd_extra" parameter should also be
LONG_PTR to be able to pass 64-bit data pointer on x64 platforms.
Therefore fix also setting the wc.cbWndExtra size. One should note that the ANSI
SHCreateWorkerWindowA() function had everything OK already.
---
dll/win32/shlwapi/ordinal.c | 31 +++++++++++++++++++++++++++++++
dll/win32/shlwapi/shlwapi.spec | 4 ++--
sdk/include/reactos/shlwapi_undoc.h | 8 ++++----
3 files changed, 37 insertions(+), 6 deletions(-)
diff --git a/dll/win32/shlwapi/ordinal.c b/dll/win32/shlwapi/ordinal.c
index b2543d4154..d81adbbf0b 100644
--- a/dll/win32/shlwapi/ordinal.c
+++ b/dll/win32/shlwapi/ordinal.c
@@ -2555,8 +2555,13 @@ HRESULT WINAPI IUnknown_GetSite(LPUNKNOWN lpUnknown, REFIID iid,
PVOID *lppSite)
* Success: The window handle of the newly created window.
* Failure: 0.
*/
+#ifndef __REACTOS__
HWND WINAPI SHCreateWorkerWindowA(LONG wndProc, HWND hWndParent, DWORD dwExStyle,
DWORD dwStyle, HMENU hMenu, LONG_PTR wnd_extra)
+#else
+HWND WINAPI SHCreateWorkerWindowA(WNDPROC wndProc, HWND hWndParent, DWORD dwExStyle,
+ DWORD dwStyle, HMENU hMenu, LONG_PTR wnd_extra)
+#endif
{
static const char szClass[] = "WorkerA";
WNDCLASSA wc;
@@ -2584,8 +2589,12 @@ HWND WINAPI SHCreateWorkerWindowA(LONG wndProc, HWND hWndParent,
DWORD dwExStyle
if (hWnd)
{
SetWindowLongPtrW(hWnd, 0, wnd_extra);
+#ifndef __REACTOS__
if (wndProc) SetWindowLongPtrA(hWnd, GWLP_WNDPROC, wndProc);
+#else
+ if (wndProc) SetWindowLongPtrA(hWnd, GWLP_WNDPROC, (LONG_PTR)wndProc);
+#endif
}
return hWnd;
@@ -2844,28 +2853,45 @@ DWORD WINAPI WhichPlatform(void)
*
* Unicode version of SHCreateWorkerWindowA.
*/
+#ifndef __REACTOS__
HWND WINAPI SHCreateWorkerWindowW(LONG wndProc, HWND hWndParent, DWORD dwExStyle,
DWORD dwStyle, HMENU hMenu, LONG msg_result)
+#else
+HWND WINAPI SHCreateWorkerWindowW(WNDPROC wndProc, HWND hWndParent, DWORD dwExStyle,
+ DWORD dwStyle, HMENU hMenu, LONG_PTR wnd_extra)
+#endif
{
static const WCHAR szClass[] = { 'W', 'o', 'r', 'k',
'e', 'r', 'W', 0 };
WNDCLASSW wc;
HWND hWnd;
TRACE("(0x%08x, %p, 0x%08x, 0x%08x, %p, 0x%08x)\n",
+#ifndef __REACTOS__
wndProc, hWndParent, dwExStyle, dwStyle, hMenu, msg_result);
+#else
+ wndProc, hWndParent, dwExStyle, dwStyle, hMenu, wnd_extra);
+#endif
/* If our OS is natively ANSI, use the ANSI version */
if (GetVersion() & 0x80000000) /* not NT */
{
TRACE("fallback to ANSI, ver 0x%08x\n", GetVersion());
+#ifndef __REACTOS__
return SHCreateWorkerWindowA(wndProc, hWndParent, dwExStyle, dwStyle, hMenu,
msg_result);
+#else
+ return SHCreateWorkerWindowA(wndProc, hWndParent, dwExStyle, dwStyle, hMenu,
wnd_extra);
+#endif
}
/* Create Window class */
wc.style = 0;
wc.lpfnWndProc = DefWindowProcW;
wc.cbClsExtra = 0;
+#ifndef __REACTOS__
wc.cbWndExtra = 4;
+#else
+ wc.cbWndExtra = sizeof(LONG_PTR);
+#endif
wc.hInstance = shlwapi_hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursorW(NULL, (LPWSTR)IDC_ARROW);
@@ -2879,9 +2905,14 @@ HWND WINAPI SHCreateWorkerWindowW(LONG wndProc, HWND hWndParent,
DWORD dwExStyle
hWndParent, hMenu, shlwapi_hInstance, 0);
if (hWnd)
{
+#ifndef __REACTOS__
SetWindowLongPtrW(hWnd, DWLP_MSGRESULT, msg_result);
if (wndProc) SetWindowLongPtrW(hWnd, GWLP_WNDPROC, wndProc);
+#else
+ SetWindowLongPtrW(hWnd, 0, wnd_extra);
+ if (wndProc) SetWindowLongPtrW(hWnd, GWLP_WNDPROC, (LONG_PTR)wndProc);
+#endif
}
return hWnd;
diff --git a/dll/win32/shlwapi/shlwapi.spec b/dll/win32/shlwapi/shlwapi.spec
index e49c87e1c1..b70601775d 100644
--- a/dll/win32/shlwapi/shlwapi.spec
+++ b/dll/win32/shlwapi/shlwapi.spec
@@ -254,7 +254,7 @@
254 stub -noname StopWatchExW
255 stub -noname EventTraceHandler
256 stdcall -noname IUnknown_GetSite(ptr ptr ptr)
-257 stdcall -noname SHCreateWorkerWindowA(long ptr long long ptr long)
+257 stdcall -noname SHCreateWorkerWindowA(ptr ptr long long ptr long)
258 stub -noname SHRegisterWaitForSingleObject
259 stub -noname SHUnregisterWait
260 stdcall -noname SHQueueUserWorkItem(long long long long long long long)
@@ -275,7 +275,7 @@
275 stub -noname RegisterGlobalHotkeyA
276 stdcall -noname WhichPlatform()
277 stub -noname SHDialogBox
-278 stdcall -noname SHCreateWorkerWindowW(long long long long long long)
+278 stdcall -noname SHCreateWorkerWindowW(ptr ptr long long ptr long)
279 stdcall -noname SHInvokeDefaultCommand(ptr ptr ptr)
280 stdcall -noname SHRegGetIntW(ptr wstr long)
281 stdcall -noname SHPackDispParamsV(ptr ptr long ptr)
diff --git a/sdk/include/reactos/shlwapi_undoc.h b/sdk/include/reactos/shlwapi_undoc.h
index 3fb4b21f91..27000e3bdd 100644
--- a/sdk/include/reactos/shlwapi_undoc.h
+++ b/sdk/include/reactos/shlwapi_undoc.h
@@ -92,11 +92,11 @@ HRESULT WINAPI SHGetPerScreenResName(OUT LPWSTR lpResName,
HRESULT WINAPI SHPropertyBag_ReadStream(IPropertyBag*,LPCWSTR,IStream**);
-HWND WINAPI SHCreateWorkerWindowA(LONG wndProc, HWND hWndParent, DWORD dwExStyle,
- DWORD dwStyle, HMENU hMenu, LONG z);
+HWND WINAPI SHCreateWorkerWindowA(WNDPROC wndProc, HWND hWndParent, DWORD dwExStyle,
+ DWORD dwStyle, HMENU hMenu, LONG_PTR wnd_extra);
-HWND WINAPI SHCreateWorkerWindowW(LONG wndProc, HWND hWndParent, DWORD dwExStyle,
- DWORD dwStyle, HMENU hMenu, LONG z);
+HWND WINAPI SHCreateWorkerWindowW(WNDPROC wndProc, HWND hWndParent, DWORD dwExStyle,
+ DWORD dwStyle, HMENU hMenu, LONG_PTR wnd_extra);
#ifdef UNICODE
#define SHCreateWorkerWindow SHCreateWorkerWindowW
#else