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