Nikolay Sivov : ole32: Marshal HBRUSH as remotable handle.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jun 16 10:13:13 CDT 2015
Module: wine
Branch: master
Commit: 61368e76e4b7a31940310a87b47816acb1eea48f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=61368e76e4b7a31940310a87b47816acb1eea48f
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue Jun 16 08:57:30 2015 +0300
ole32: Marshal HBRUSH as remotable handle.
---
dlls/ole32/ole32.spec | 8 ++++----
dlls/ole32/tests/usrmarshal.c | 45 +++++++++++++++++++++++++++++++++++++++++++
dlls/ole32/usrmarshal.c | 1 +
3 files changed, 50 insertions(+), 4 deletions(-)
diff --git a/dlls/ole32/ole32.spec b/dlls/ole32/ole32.spec
index 7019450..b36e683 100644
--- a/dlls/ole32/ole32.spec
+++ b/dlls/ole32/ole32.spec
@@ -124,10 +124,10 @@
@ stdcall HBITMAP_UserMarshal(ptr ptr ptr)
@ stdcall HBITMAP_UserSize(ptr long ptr)
@ stdcall HBITMAP_UserUnmarshal(ptr ptr ptr)
-@ stub HBRUSH_UserFree
-@ stub HBRUSH_UserMarshal
-@ stub HBRUSH_UserSize
-@ stub HBRUSH_UserUnmarshal
+@ stdcall HBRUSH_UserFree(ptr ptr)
+@ stdcall HBRUSH_UserMarshal(ptr ptr ptr)
+@ stdcall HBRUSH_UserSize(ptr long ptr)
+@ stdcall HBRUSH_UserUnmarshal(ptr ptr ptr)
@ stdcall HDC_UserFree(ptr ptr)
@ stdcall HDC_UserMarshal(ptr ptr ptr)
@ stdcall HDC_UserSize(ptr long ptr)
diff --git a/dlls/ole32/tests/usrmarshal.c b/dlls/ole32/tests/usrmarshal.c
index 6f90c53..b1803df 100644
--- a/dlls/ole32/tests/usrmarshal.c
+++ b/dlls/ole32/tests/usrmarshal.c
@@ -44,6 +44,11 @@ unsigned char * __RPC_USER HMETAFILEPICT_UserMarshal (ULONG *, unsigned char *,
unsigned char * __RPC_USER HMETAFILEPICT_UserUnmarshal(ULONG *, unsigned char *, HMETAFILEPICT *);
void __RPC_USER HMETAFILEPICT_UserFree(ULONG *, HMETAFILEPICT *);
+ULONG __RPC_USER HBRUSH_UserSize(ULONG *, ULONG, HBRUSH *);
+unsigned char * __RPC_USER HBRUSH_UserMarshal(ULONG *, unsigned char *, HBRUSH *);
+unsigned char * __RPC_USER HBRUSH_UserUnmarshal(ULONG *, unsigned char *, HBRUSH *);
+void __RPC_USER HBRUSH_UserFree(ULONG *, HBRUSH *);
+
static BOOL g_expect_user_alloc;
static void * WINAPI user_allocate(SIZE_T size)
{
@@ -932,6 +937,45 @@ static void test_marshal_HICON(void)
DestroyIcon(hIcon);
}
+static void test_marshal_HBRUSH(void)
+{
+ MIDL_STUB_MESSAGE stub_msg;
+ HBRUSH hBrush, hBrush2;
+ USER_MARSHAL_CB umcb;
+ RPC_MESSAGE rpc_msg;
+ unsigned char *buffer;
+ LOGBRUSH logbrush;
+ wireHBRUSH wirehbrush;
+ ULONG size;
+
+ logbrush.lbStyle = BS_SOLID;
+ logbrush.lbColor = RGB(0, 0, 0);
+ logbrush.lbHatch = 0;
+
+ hBrush = CreateBrushIndirect(&logbrush);
+ ok(hBrush != 0, "CreateBrushIndirect failed\n");
+
+ init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL);
+ size = HBRUSH_UserSize(&umcb.Flags, 0, &hBrush);
+ ok(size == sizeof(*wirehbrush), "Wrong size %d\n", size);
+
+ buffer = HeapAlloc(GetProcessHeap(), 0, size);
+ init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL);
+ HBRUSH_UserMarshal(&umcb.Flags, buffer, &hBrush);
+ wirehbrush = (wireHBRUSH)buffer;
+ ok(wirehbrush->fContext == WDT_INPROC_CALL, "Context should be WDT_INPROC_CALL instead of 0x%08x\n", wirehbrush->fContext);
+ ok(wirehbrush->u.hInproc == (LONG_PTR)hBrush, "Marshaled value should be %p instead of %x\n", hBrush, wirehbrush->u.hRemote);
+
+ init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL);
+ HBRUSH_UserUnmarshal(&umcb.Flags, buffer, &hBrush2);
+ ok(hBrush == hBrush2, "Didn't unmarshal properly\n");
+ HeapFree(GetProcessHeap(), 0, buffer);
+
+ init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL);
+ HBRUSH_UserFree(&umcb.Flags, &hBrush2);
+ DeleteObject(hBrush);
+}
+
START_TEST(usrmarshal)
{
CoInitialize(NULL);
@@ -947,6 +991,7 @@ START_TEST(usrmarshal)
test_marshal_SNB();
test_marshal_HDC();
test_marshal_HICON();
+ test_marshal_HBRUSH();
CoUninitialize();
}
diff --git a/dlls/ole32/usrmarshal.c b/dlls/ole32/usrmarshal.c
index 89f4f4a..957338a 100644
--- a/dlls/ole32/usrmarshal.c
+++ b/dlls/ole32/usrmarshal.c
@@ -343,6 +343,7 @@ IMPL_WIREM_HANDLE(HMENU)
IMPL_WIREM_HANDLE(HWND)
IMPL_WIREM_HANDLE(HDC)
IMPL_WIREM_HANDLE(HICON)
+IMPL_WIREM_HANDLE(HBRUSH)
/******************************************************************************
* HGLOBAL_UserSize [OLE32.@]
More information about the wine-cvs
mailing list