mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 16:36:07 +00:00
Implement GetClassLongPtrA/W
svn path=/trunk/; revision=50399
This commit is contained in:
parent
030dbb0bbc
commit
98fe9682e3
1 changed files with 256 additions and 143 deletions
|
@ -339,6 +339,161 @@ IntGetWndProc(PWND pWnd, BOOL Ansi)
|
||||||
return (gcpd ? gcpd : Ret);
|
return (gcpd ? gcpd : Ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ULONG_PTR FASTCALL
|
||||||
|
IntGetClassLongA(PWND Wnd, PCLS Class, int nIndex)
|
||||||
|
{
|
||||||
|
ULONG_PTR Ret = 0;
|
||||||
|
|
||||||
|
if (nIndex >= 0)
|
||||||
|
{
|
||||||
|
if (nIndex + sizeof(ULONG_PTR) < nIndex ||
|
||||||
|
nIndex + sizeof(ULONG_PTR) > Class->cbclsExtra)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Ret = *(PULONG_PTR)((ULONG_PTR)(Class + 1) + nIndex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (nIndex)
|
||||||
|
{
|
||||||
|
case GCL_CBWNDEXTRA:
|
||||||
|
Ret = (ULONG_PTR)Class->cbwndExtra;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCL_CBCLSEXTRA:
|
||||||
|
Ret = (ULONG_PTR)Class->cbclsExtra;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCL_HBRBACKGROUND:
|
||||||
|
Ret = (ULONG_PTR)Class->hbrBackground;
|
||||||
|
if (Ret != 0 && Ret < 0x4000)
|
||||||
|
Ret = (ULONG_PTR)GetSysColorBrush((ULONG)Ret - 1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCL_HMODULE:
|
||||||
|
//ERR("Cls 0x%x GCL_HMODULE 0x%x\n", Wnd->pcls, Class->hModule);
|
||||||
|
Ret = (ULONG_PTR)Class->hModule;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCL_MENUNAME:
|
||||||
|
Ret = (ULONG_PTR)Class->lpszClientAnsiMenuName;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCL_STYLE:
|
||||||
|
Ret = (ULONG_PTR)Class->style;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCW_ATOM:
|
||||||
|
Ret = (ULONG_PTR)Class->atomClassName;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCLP_HCURSOR:
|
||||||
|
/* FIXME - get handle from pointer to CURSOR object */
|
||||||
|
Ret = (ULONG_PTR)Class->hCursor;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCLP_HICON:
|
||||||
|
/* FIXME - get handle from pointer to ICON object */
|
||||||
|
Ret = (ULONG_PTR)Class->hIcon;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCLP_HICONSM:
|
||||||
|
/* FIXME - get handle from pointer to ICON object */
|
||||||
|
Ret = (ULONG_PTR)Class->hIconSm;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCLP_WNDPROC:
|
||||||
|
Ret = IntGetClsWndProc(Wnd, Class, TRUE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
SetLastError(ERROR_INVALID_INDEX);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG_PTR FASTCALL
|
||||||
|
IntGetClassLongW (PWND Wnd, PCLS Class, int nIndex)
|
||||||
|
{
|
||||||
|
ULONG_PTR Ret = 0;
|
||||||
|
|
||||||
|
if (nIndex >= 0)
|
||||||
|
{
|
||||||
|
if (nIndex + sizeof(ULONG_PTR) < nIndex ||
|
||||||
|
nIndex + sizeof(ULONG_PTR) > Class->cbclsExtra)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Ret = *(PULONG_PTR)((ULONG_PTR)(Class + 1) + nIndex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (nIndex)
|
||||||
|
{
|
||||||
|
case GCL_CBWNDEXTRA:
|
||||||
|
Ret = (ULONG_PTR)Class->cbwndExtra;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCL_CBCLSEXTRA:
|
||||||
|
Ret = (ULONG_PTR)Class->cbclsExtra;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCLP_HBRBACKGROUND:
|
||||||
|
Ret = (ULONG_PTR)Class->hbrBackground;
|
||||||
|
if (Ret != 0 && Ret < 0x4000)
|
||||||
|
Ret = (ULONG_PTR)GetSysColorBrush((ULONG)Ret - 1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCL_HMODULE:
|
||||||
|
Ret = (ULONG_PTR)Class->hModule;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCLP_MENUNAME:
|
||||||
|
Ret = (ULONG_PTR)Class->lpszClientUnicodeMenuName;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCL_STYLE:
|
||||||
|
Ret = (ULONG_PTR)Class->style;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCW_ATOM:
|
||||||
|
Ret = (ULONG_PTR)Class->atomClassName;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCLP_HCURSOR:
|
||||||
|
/* FIXME - get handle from pointer to CURSOR object */
|
||||||
|
Ret = (ULONG_PTR)Class->hCursor;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCLP_HICON:
|
||||||
|
/* FIXME - get handle from pointer to ICON object */
|
||||||
|
Ret = (ULONG_PTR)Class->hIcon;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCLP_HICONSM:
|
||||||
|
/* FIXME - get handle from pointer to ICON object */
|
||||||
|
Ret = (ULONG_PTR)Class->hIconSm;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GCLP_WNDPROC:
|
||||||
|
Ret = IntGetClsWndProc(Wnd, Class, FALSE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
SetLastError(ERROR_INVALID_INDEX);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
|
@ -360,75 +515,26 @@ GetClassLongA(HWND hWnd, int nIndex)
|
||||||
Class = DesktopPtrToUser(Wnd->pcls);
|
Class = DesktopPtrToUser(Wnd->pcls);
|
||||||
if (Class != NULL)
|
if (Class != NULL)
|
||||||
{
|
{
|
||||||
if (nIndex >= 0)
|
#ifdef _WIN64
|
||||||
{
|
switch (nIndex)
|
||||||
if (nIndex + sizeof(ULONG_PTR) < nIndex ||
|
{
|
||||||
nIndex + sizeof(ULONG_PTR) > Class->cbclsExtra)
|
case GCLP_HBRBACKGROUND:
|
||||||
{
|
case GCLP_HCURSOR:
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
case GCLP_HICON:
|
||||||
}
|
case GCLP_HICONSM:
|
||||||
else
|
case GCLP_HMODULE:
|
||||||
Ret = *(PULONG_PTR)((ULONG_PTR)(Class + 1) + nIndex);
|
case GCLP_MENUNAME:
|
||||||
}
|
case GCLP_WNDPROC:
|
||||||
else
|
SetLastError(ERROR_INVALID_INDEX);
|
||||||
{
|
break;
|
||||||
switch (nIndex)
|
|
||||||
{
|
|
||||||
case GCL_CBWNDEXTRA:
|
|
||||||
Ret = (ULONG_PTR)Class->cbwndExtra;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCL_CBCLSEXTRA:
|
default:
|
||||||
Ret = (ULONG_PTR)Class->cbclsExtra;
|
Ret = IntGetClassLongA(Wnd, Class, nIndex);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case GCL_HBRBACKGROUND:
|
#else
|
||||||
Ret = (ULONG_PTR)Class->hbrBackground;
|
Ret = IntGetClassLongA(Wnd, Class, nIndex);
|
||||||
if (Ret != 0 && Ret < 0x4000)
|
#endif
|
||||||
Ret = (ULONG_PTR)GetSysColorBrush((ULONG)Ret - 1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCL_HMODULE:
|
|
||||||
//ERR("Cls 0x%x GCL_HMODULE 0x%x\n", Wnd->pcls, Class->hModule);
|
|
||||||
Ret = (ULONG_PTR)Class->hModule;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCL_MENUNAME:
|
|
||||||
Ret = (ULONG_PTR)Class->lpszClientAnsiMenuName;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCL_STYLE:
|
|
||||||
Ret = (ULONG_PTR)Class->style;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCW_ATOM:
|
|
||||||
Ret = (ULONG_PTR)Class->atomClassName;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCLP_HCURSOR:
|
|
||||||
/* FIXME - get handle from pointer to CURSOR object */
|
|
||||||
Ret = (ULONG_PTR)Class->hCursor;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCLP_HICON:
|
|
||||||
/* FIXME - get handle from pointer to ICON object */
|
|
||||||
Ret = (ULONG_PTR)Class->hIcon;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCLP_HICONSM:
|
|
||||||
/* FIXME - get handle from pointer to ICON object */
|
|
||||||
Ret = (ULONG_PTR)Class->hIconSm;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCLP_WNDPROC:
|
|
||||||
Ret = IntGetClsWndProc(Wnd, Class, TRUE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
SetLastError(ERROR_INVALID_INDEX);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -441,7 +547,7 @@ GetClassLongA(HWND hWnd, int nIndex)
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
return Ret;
|
return (DWORD)Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -465,74 +571,26 @@ GetClassLongW ( HWND hWnd, int nIndex )
|
||||||
Class = DesktopPtrToUser(Wnd->pcls);
|
Class = DesktopPtrToUser(Wnd->pcls);
|
||||||
if (Class != NULL)
|
if (Class != NULL)
|
||||||
{
|
{
|
||||||
if (nIndex >= 0)
|
#ifdef _WIN64
|
||||||
{
|
switch (nIndex)
|
||||||
if (nIndex + sizeof(ULONG_PTR) < nIndex ||
|
{
|
||||||
nIndex + sizeof(ULONG_PTR) > Class->cbclsExtra)
|
case GCLP_HBRBACKGROUND:
|
||||||
{
|
case GCLP_HCURSOR:
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
case GCLP_HICON:
|
||||||
}
|
case GCLP_HICONSM:
|
||||||
else
|
case GCLP_HMODULE:
|
||||||
Ret = *(PULONG_PTR)((ULONG_PTR)(Class + 1) + nIndex);
|
case GCLP_MENUNAME:
|
||||||
}
|
case GCLP_WNDPROC:
|
||||||
else
|
SetLastError(ERROR_INVALID_INDEX);
|
||||||
{
|
break;
|
||||||
switch (nIndex)
|
|
||||||
{
|
|
||||||
case GCL_CBWNDEXTRA:
|
|
||||||
Ret = (ULONG_PTR)Class->cbwndExtra;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCL_CBCLSEXTRA:
|
default:
|
||||||
Ret = (ULONG_PTR)Class->cbclsExtra;
|
Ret = IntGetClassLongW(Wnd, Class, nIndex);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case GCL_HBRBACKGROUND:
|
#else
|
||||||
Ret = (ULONG_PTR)Class->hbrBackground;
|
Ret = IntGetClassLongW(Wnd, Class, nIndex);
|
||||||
if (Ret != 0 && Ret < 0x4000)
|
#endif
|
||||||
Ret = (ULONG_PTR)GetSysColorBrush((ULONG)Ret - 1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCL_HMODULE:
|
|
||||||
Ret = (ULONG_PTR)Class->hModule;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCL_MENUNAME:
|
|
||||||
Ret = (ULONG_PTR)Class->lpszClientUnicodeMenuName;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCL_STYLE:
|
|
||||||
Ret = (ULONG_PTR)Class->style;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCW_ATOM:
|
|
||||||
Ret = (ULONG_PTR)Class->atomClassName;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCLP_HCURSOR:
|
|
||||||
/* FIXME - get handle from pointer to CURSOR object */
|
|
||||||
Ret = (ULONG_PTR)Class->hCursor;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCLP_HICON:
|
|
||||||
/* FIXME - get handle from pointer to ICON object */
|
|
||||||
Ret = (ULONG_PTR)Class->hIcon;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCLP_HICONSM:
|
|
||||||
/* FIXME - get handle from pointer to ICON object */
|
|
||||||
Ret = (ULONG_PTR)Class->hIconSm;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GCLP_WNDPROC:
|
|
||||||
Ret = IntGetClsWndProc(Wnd, Class, FALSE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
SetLastError(ERROR_INVALID_INDEX);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -541,35 +599,90 @@ GetClassLongW ( HWND hWnd, int nIndex )
|
||||||
}
|
}
|
||||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
|
Ret = 0;
|
||||||
}
|
}
|
||||||
_SEH2_END;
|
_SEH2_END;
|
||||||
|
|
||||||
return Ret;
|
return (DWORD)Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
ULONG_PTR
|
ULONG_PTR
|
||||||
WINAPI
|
WINAPI
|
||||||
GetClassLongPtrA(HWND hWnd,
|
GetClassLongPtrA(HWND hWnd,
|
||||||
INT nIndex)
|
INT nIndex)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
PWND Wnd;
|
||||||
return 0;
|
PCLS Class;
|
||||||
|
ULONG_PTR Ret = 0;
|
||||||
|
|
||||||
|
TRACE("%p %d\n", hWnd, nIndex);
|
||||||
|
|
||||||
|
Wnd = ValidateHwnd(hWnd);
|
||||||
|
if (!Wnd)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
_SEH2_TRY
|
||||||
|
{
|
||||||
|
Class = DesktopPtrToUser(Wnd->pcls);
|
||||||
|
if (Class != NULL)
|
||||||
|
{
|
||||||
|
Ret = IntGetClassLongA(Wnd, Class, nIndex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WARN("Invalid class for hwnd 0x%p!\n", hWnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Ret = 0;
|
||||||
|
}
|
||||||
|
_SEH2_END;
|
||||||
|
|
||||||
|
return Ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
ULONG_PTR
|
ULONG_PTR
|
||||||
WINAPI
|
WINAPI
|
||||||
GetClassLongPtrW(HWND hWnd,
|
GetClassLongPtrW(HWND hWnd,
|
||||||
INT nIndex)
|
INT nIndex)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
PWND Wnd;
|
||||||
return 0;
|
PCLS Class;
|
||||||
|
ULONG_PTR Ret = 0;
|
||||||
|
|
||||||
|
TRACE("%p %d\n", hWnd, nIndex);
|
||||||
|
|
||||||
|
Wnd = ValidateHwnd(hWnd);
|
||||||
|
if (!Wnd)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
_SEH2_TRY
|
||||||
|
{
|
||||||
|
Class = DesktopPtrToUser(Wnd->pcls);
|
||||||
|
if (Class != NULL)
|
||||||
|
{
|
||||||
|
Ret = IntGetClassLongW(Wnd, Class, nIndex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WARN("Invalid class for hwnd 0x%p!\n", hWnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Ret = 0;
|
||||||
|
}
|
||||||
|
_SEH2_END;
|
||||||
|
|
||||||
|
return Ret;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue