server: Support using a name to destroy a window class too.
This commit is contained in:
parent
0762d98f7c
commit
b9b940fab9
|
@ -573,8 +573,15 @@ ATOM WINAPI RegisterClassExW( const WNDCLASSEXW* wc )
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI UnregisterClassA( LPCSTR className, HINSTANCE hInstance )
|
BOOL WINAPI UnregisterClassA( LPCSTR className, HINSTANCE hInstance )
|
||||||
{
|
{
|
||||||
ATOM atom = HIWORD(className) ? GlobalFindAtomA( className ) : LOWORD(className);
|
if (!IS_INTRESOURCE(className))
|
||||||
return UnregisterClassW( (LPCWSTR)MAKEINTATOM(atom), hInstance );
|
{
|
||||||
|
WCHAR name[MAX_ATOM_LEN + 1];
|
||||||
|
|
||||||
|
if (!MultiByteToWideChar( CP_ACP, 0, className, -1, name, MAX_ATOM_LEN + 1 ))
|
||||||
|
return FALSE;
|
||||||
|
return UnregisterClassW( name, hInstance );
|
||||||
|
}
|
||||||
|
return UnregisterClassW( (LPCWSTR)className, hInstance );
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -583,20 +590,14 @@ BOOL WINAPI UnregisterClassA( LPCSTR className, HINSTANCE hInstance )
|
||||||
BOOL WINAPI UnregisterClassW( LPCWSTR className, HINSTANCE hInstance )
|
BOOL WINAPI UnregisterClassW( LPCWSTR className, HINSTANCE hInstance )
|
||||||
{
|
{
|
||||||
CLASS *classPtr = NULL;
|
CLASS *classPtr = NULL;
|
||||||
ATOM atom = HIWORD(className) ? GlobalFindAtomW( className ) : LOWORD(className);
|
|
||||||
|
|
||||||
TRACE("%s %p %x\n",debugstr_w(className), hInstance, atom);
|
TRACE("%s %p\n",debugstr_w(className), hInstance);
|
||||||
|
|
||||||
if (!atom)
|
|
||||||
{
|
|
||||||
SetLastError( ERROR_CLASS_DOES_NOT_EXIST );
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
SERVER_START_REQ( destroy_class )
|
SERVER_START_REQ( destroy_class )
|
||||||
{
|
{
|
||||||
req->atom = atom;
|
|
||||||
req->instance = hInstance;
|
req->instance = hInstance;
|
||||||
|
if (IS_INTRESOURCE(className)) req->atom = LOWORD(className);
|
||||||
|
else wine_server_add_data( req, className, strlenW(className)*sizeof(WCHAR) );
|
||||||
if (!wine_server_call_err( req )) classPtr = reply->client_ptr;
|
if (!wine_server_call_err( req )) classPtr = reply->client_ptr;
|
||||||
}
|
}
|
||||||
SERVER_END_REQ;
|
SERVER_END_REQ;
|
||||||
|
|
|
@ -3609,6 +3609,7 @@ struct destroy_class_request
|
||||||
struct request_header __header;
|
struct request_header __header;
|
||||||
atom_t atom;
|
atom_t atom;
|
||||||
void* instance;
|
void* instance;
|
||||||
|
/* VARARG(name,unicode_str); */
|
||||||
};
|
};
|
||||||
struct destroy_class_reply
|
struct destroy_class_reply
|
||||||
{
|
{
|
||||||
|
@ -4882,6 +4883,6 @@ union generic_reply
|
||||||
struct set_completion_info_reply set_completion_info_reply;
|
struct set_completion_info_reply set_completion_info_reply;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SERVER_PROTOCOL_VERSION 325
|
#define SERVER_PROTOCOL_VERSION 326
|
||||||
|
|
||||||
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
|
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
|
||||||
|
|
|
@ -186,9 +186,13 @@ DECL_HANDLER(create_class)
|
||||||
/* destroy a window class */
|
/* destroy a window class */
|
||||||
DECL_HANDLER(destroy_class)
|
DECL_HANDLER(destroy_class)
|
||||||
{
|
{
|
||||||
struct window_class *class = find_class( current->process, req->atom, req->instance );
|
struct window_class *class;
|
||||||
|
atom_t atom = req->atom;
|
||||||
|
|
||||||
if (!class)
|
if (get_req_data_size())
|
||||||
|
atom = find_global_atom( NULL, get_req_data(), get_req_data_size() / sizeof(WCHAR) );
|
||||||
|
|
||||||
|
if (!(class = find_class( current->process, atom, req->instance )))
|
||||||
set_win32_error( ERROR_CLASS_DOES_NOT_EXIST );
|
set_win32_error( ERROR_CLASS_DOES_NOT_EXIST );
|
||||||
else if (class->count)
|
else if (class->count)
|
||||||
set_win32_error( ERROR_CLASS_HAS_WINDOWS );
|
set_win32_error( ERROR_CLASS_HAS_WINDOWS );
|
||||||
|
|
|
@ -2610,6 +2610,7 @@ enum message_type
|
||||||
@REQ(destroy_class)
|
@REQ(destroy_class)
|
||||||
atom_t atom; /* class atom */
|
atom_t atom; /* class atom */
|
||||||
void* instance; /* module instance */
|
void* instance; /* module instance */
|
||||||
|
VARARG(name,unicode_str); /* class name */
|
||||||
@REPLY
|
@REPLY
|
||||||
void* client_ptr; /* pointer to class in client address space */
|
void* client_ptr; /* pointer to class in client address space */
|
||||||
@END
|
@END
|
||||||
|
|
|
@ -3205,7 +3205,9 @@ static void dump_create_class_reply( const struct create_class_reply *req )
|
||||||
static void dump_destroy_class_request( const struct destroy_class_request *req )
|
static void dump_destroy_class_request( const struct destroy_class_request *req )
|
||||||
{
|
{
|
||||||
fprintf( stderr, " atom=%04x,", req->atom );
|
fprintf( stderr, " atom=%04x,", req->atom );
|
||||||
fprintf( stderr, " instance=%p", req->instance );
|
fprintf( stderr, " instance=%p,", req->instance );
|
||||||
|
fprintf( stderr, " name=" );
|
||||||
|
dump_varargs_unicode_str( cur_size );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dump_destroy_class_reply( const struct destroy_class_reply *req )
|
static void dump_destroy_class_reply( const struct destroy_class_reply *req )
|
||||||
|
|
Loading…
Reference in New Issue