implemented UnregisterClass()

svn path=/trunk/; revision=6905
This commit is contained in:
Thomas Bluemel 2003-12-07 22:25:34 +00:00
parent 7c98a98880
commit 24c9fab813
4 changed files with 85 additions and 23 deletions

View file

@ -1714,12 +1714,12 @@ STDCALL
NtUserUnlockWindowStation(
HWINSTA hWindowStation);
DWORD
BOOL
STDCALL
NtUserUnregisterClass(
DWORD Unknown0,
DWORD Unknown1,
DWORD Unknown2);
LPCWSTR ClassNameOrAtom,
HINSTANCE hInstance,
DWORD Unknown);
BOOL
STDCALL

View file

@ -1,4 +1,4 @@
/* $Id: class.c,v 1.40 2003/12/07 10:31:21 navaraf Exp $
/* $Id: class.c,v 1.41 2003/12/07 22:25:34 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS user32.dll
@ -731,7 +731,7 @@ SetWindowLongW(
/*
* @unimplemented
* @implemented
*/
WINBOOL
STDCALL
@ -739,13 +739,33 @@ UnregisterClassA(
LPCSTR lpClassName,
HINSTANCE hInstance)
{
UNIMPLEMENTED;
LPWSTR ClassName;
NTSTATUS Status;
WINBOOL Result;
if(!IS_ATOM(lpClassName))
{
Status = HEAP_strdupAtoW(&ClassName, lpClassName, NULL);
if(!NT_SUCCESS(Status))
{
SetLastError(RtlNtStatusToDosError(Status));
return FALSE;
}
}
else
ClassName = (LPWSTR)lpClassName;
Result = (WINBOOL)NtUserUnregisterClass((LPCWSTR)ClassName, hInstance, 0);
if(ClassName && !IS_ATOM(lpClassName))
HEAP_free(ClassName);
return Result;
}
/*
* @unimplemented
* @implemented
*/
WINBOOL
STDCALL
@ -753,8 +773,7 @@ UnregisterClassW(
LPCWSTR lpClassName,
HINSTANCE hInstance)
{
UNIMPLEMENTED;
return FALSE;
return (WINBOOL)NtUserUnregisterClass(lpClassName, hInstance, 0);
}
/* EOF */

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: class.c,v 1.42 2003/12/07 10:31:21 navaraf Exp $
/* $Id: class.c,v 1.43 2003/12/07 22:25:34 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -157,6 +157,7 @@ NtUserGetClassInfo(HINSTANCE hInstance, LPCWSTR lpClassName,
{
PWNDCLASS_OBJECT Class;
NTSTATUS Status;
RTL_ATOM Atom;
Status = ClassReferenceClassByNameOrAtom(&Class, lpClassName);
if (!NT_SUCCESS(Status))
@ -187,8 +188,11 @@ NtUserGetClassInfo(HINSTANCE hInstance, LPCWSTR lpClassName,
lpWndClassEx->lpszMenuName = (LPCWSTR)NULL;
lpWndClassEx->lpszClassName = lpClassName;
lpWndClassEx->hIconSm = Class->hIconSm;
Atom = Class->Atom;
return Class->Atom;
ObmDereferenceObject(Class);
return Atom;
}
ULONG FASTCALL
@ -606,13 +610,45 @@ NtUserSetClassWord(DWORD Unknown0,
return(0);
}
DWORD STDCALL
NtUserUnregisterClass(DWORD Unknown0,
DWORD Unknown1,
DWORD Unknown2)
BOOL STDCALL
NtUserUnregisterClass(LPCWSTR ClassNameOrAtom,
HINSTANCE hInstance,
DWORD Unknown)
{
UNIMPLEMENTED;
return(0);
NTSTATUS Status;
PWNDCLASS_OBJECT Class;
if(!ClassNameOrAtom)
{
SetLastWin32Error(ERROR_INVALID_PARAMETER);
return FALSE;
}
Status = ClassReferenceClassByNameOrAtom(&Class, ClassNameOrAtom);
if(!NT_SUCCESS(Status))
{
SetLastWin32Error(ERROR_CLASS_DOES_NOT_EXIST);
return FALSE;
}
if(ObmGetReferenceCount(Class) > 2)
{
ObmDereferenceObject(Class);
SetLastWin32Error(ERROR_CLASS_HAS_WINDOWS);
return FALSE;
}
/* Dereference the ClassReferenceClassByNameOrAtom() call */
ObmDereferenceObject(Class);
RemoveEntryList(&Class->ListEntry);
/* FIXME - delete the atom? */
/* Free the object */
ObmDereferenceObject(Class);
return TRUE;
}
/* EOF */

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: window.c,v 1.152 2003/12/07 19:29:33 weiden Exp $
/* $Id: window.c,v 1.153 2003/12/07 22:25:34 weiden Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -369,6 +369,7 @@ static LRESULT IntDestroyWindow(PWINDOW_OBJECT Window,
IntDestroyScrollBar(Window, SB_VERT);
IntDestroyScrollBar(Window, SB_HORZ);
ObmDereferenceObject(Window->Class);
Window->Class = NULL;
ObmCloseHandle(ProcessData->WindowStation->HandleTable, Window->Self);
@ -559,6 +560,11 @@ IntCreateDesktopWindow(PWINSTATION_OBJECT WindowStation,
HWND Handle;
PWINDOW_OBJECT WindowObject;
if(!DesktopClass)
{
return (HWND)0;
}
/* Create the window object. */
WindowObject = (PWINDOW_OBJECT)ObmCreateObject(WindowStation->HandleTable,
&Handle,
@ -572,6 +578,7 @@ IntCreateDesktopWindow(PWINSTATION_OBJECT WindowStation,
/*
* Fill out the structure describing it.
*/
ObmReferenceObject(DesktopClass);
WindowObject->Class = DesktopClass;
WindowObject->ExStyle = 0;
WindowObject->Style = WS_VISIBLE;