mirror of
https://github.com/reactos/reactos.git
synced 2024-11-20 06:15:26 +00:00
[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.
This commit is contained in:
parent
a5e89014dc
commit
770bf93be3
3 changed files with 37 additions and 6 deletions
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue