https://git.reactos.org/?p=reactos.git;a=commitdiff;h=770bf93be372cfc78342e7bbf11fb2e251ae591d

commit 770bf93be372cfc78342e7bbf11fb2e251ae591d
Author:     Hermès Bélusca-Maïto <hermes.belusca-ma...@reactos.org>
AuthorDate: Tue Feb 13 00:10:09 2018 +0100
Commit:     Hermès Bélusca-Maïto <hermes.belusca-ma...@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

Reply via email to