Nikolay Sivov : shlwapi: Fix mask usage in SHSetWindowBits with tests.
Alexandre Julliard
julliard at winehq.org
Mon Mar 1 09:27:35 CST 2010
Module: wine
Branch: master
Commit: 5d74e5753f8167da33cc34ee0522ccaece883453
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5d74e5753f8167da33cc34ee0522ccaece883453
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sat Feb 27 21:56:30 2010 +0300
shlwapi: Fix mask usage in SHSetWindowBits with tests.
---
dlls/shlwapi/ordinal.c | 20 +++---
dlls/shlwapi/tests/Makefile.in | 2 +-
dlls/shlwapi/tests/ordinal.c | 136 ++++++++++++++++++++++++++++++++-------
3 files changed, 123 insertions(+), 35 deletions(-)
diff --git a/dlls/shlwapi/ordinal.c b/dlls/shlwapi/ordinal.c
index 315208c..99de394 100644
--- a/dlls/shlwapi/ordinal.c
+++ b/dlls/shlwapi/ordinal.c
@@ -1082,23 +1082,25 @@ HRESULT WINAPI IUnknown_Exec(IUnknown* lpUnknown, REFGUID pguidCmdGroup,
* PARAMS
* hWnd [I] Window to get value from
* offset [I] Offset of value
- * wMask [I] Mask for uiFlags
- * wFlags [I] Bits to set in window value
+ * mask [I] Mask for flags
+ * flags [I] Bits to set in window value
*
* RETURNS
* The new value as it was set, or 0 if any parameter is invalid.
*
* NOTES
- * Any bits set in uiMask are cleared from the value, then any bits set in
- * uiFlags are set in the value.
+ * Only bits specified in mask are affected - set if present in flags and
+ * reset otherwise.
*/
-LONG WINAPI SHSetWindowBits(HWND hwnd, INT offset, UINT wMask, UINT wFlags)
+LONG WINAPI SHSetWindowBits(HWND hwnd, INT offset, UINT mask, UINT flags)
{
- LONG ret = GetWindowLongA(hwnd, offset);
- LONG newFlags = (wFlags & wMask) | (ret & ~wFlags);
+ LONG ret = GetWindowLongW(hwnd, offset);
+ LONG new_flags = (flags & mask) | (ret & ~mask);
- if (newFlags != ret)
- ret = SetWindowLongA(hwnd, offset, newFlags);
+ TRACE("%p %d %x %x\n", hwnd, offset, mask, flags);
+
+ if (new_flags != ret)
+ ret = SetWindowLongW(hwnd, offset, new_flags);
return ret;
}
diff --git a/dlls/shlwapi/tests/Makefile.in b/dlls/shlwapi/tests/Makefile.in
index b768317..99aac87 100644
--- a/dlls/shlwapi/tests/Makefile.in
+++ b/dlls/shlwapi/tests/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../../..
SRCDIR = @srcdir@
VPATH = @srcdir@
TESTDLL = shlwapi.dll
-IMPORTS = shlwapi advapi32 ole32 oleaut32 kernel32
+IMPORTS = shlwapi user32 ole32 oleaut32 advapi32 kernel32
C_SRCS = \
assoc.c \
diff --git a/dlls/shlwapi/tests/ordinal.c b/dlls/shlwapi/tests/ordinal.c
index 22437e2..b53d81c 100644
--- a/dlls/shlwapi/tests/ordinal.c
+++ b/dlls/shlwapi/tests/ordinal.c
@@ -43,6 +43,7 @@ static HRESULT(WINAPI *pIConnectionPoint_SimpleInvoke)(IConnectionPoint*,DISPID,
static HRESULT(WINAPI *pIConnectionPoint_InvokeWithCancel)(IConnectionPoint*,DISPID,DISPPARAMS*,DWORD,DWORD);
static HRESULT(WINAPI *pConnectToConnectionPoint)(IUnknown*,REFIID,BOOL,IUnknown*, LPDWORD,IConnectionPoint **);
static HRESULT(WINAPI *pSHPropertyBag_ReadLONG)(IPropertyBag *,LPCWSTR,LPLONG);
+static LONG (WINAPI *pSHSetWindowBits)(HWND hwnd, INT offset, UINT wMask, UINT wFlags);
static HMODULE hmlang;
static HRESULT (WINAPI *pLcidToRfc1766A)(LCID, LPSTR, INT);
@@ -1397,31 +1398,116 @@ static void test_SHPropertyBag_ReadLONG(void)
IUnknown_Release((IUnknown*)pb);
}
+
+
+static void test_SHSetWindowBits(void)
+{
+ HWND hwnd;
+ DWORD style, styleold;
+ WNDCLASSA clsA;
+
+ if(!pSHSetWindowBits)
+ {
+ win_skip("SHSetWindowBits is not available\n");
+ return;
+ }
+
+ clsA.style = 0;
+ clsA.lpfnWndProc = DefWindowProcA;
+ clsA.cbClsExtra = 0;
+ clsA.cbWndExtra = 0;
+ clsA.hInstance = GetModuleHandleA(NULL);
+ clsA.hIcon = 0;
+ clsA.hCursor = LoadCursorA(0, IDC_ARROW);
+ clsA.hbrBackground = NULL;
+ clsA.lpszMenuName = NULL;
+ clsA.lpszClassName = "Shlwapi test class";
+ RegisterClassA(&clsA);
+
+ hwnd = CreateWindowA("Shlwapi test class", "Test", WS_VISIBLE, 0, 0, 100, 100,
+ NULL, NULL, GetModuleHandle(NULL), 0);
+ ok(IsWindow(hwnd), "failed to create window\n");
+
+ /* null window */
+ SetLastError(0xdeadbeef);
+ style = pSHSetWindowBits(NULL, GWL_STYLE, 0, 0);
+ ok(style == 0, "expected 0 retval, got %d\n", style);
+ ok(GetLastError() == ERROR_INVALID_WINDOW_HANDLE,
+ "expected ERROR_INVALID_WINDOW_HANDLE, got %d\n", GetLastError());
+
+ /* zero mask, zero flags */
+ styleold = GetWindowLongA(hwnd, GWL_STYLE);
+ style = pSHSetWindowBits(hwnd, GWL_STYLE, 0, 0);
+ ok(styleold == style, "expected old style\n");
+ ok(styleold == GetWindowLongA(hwnd, GWL_STYLE), "expected to keep old style\n");
+
+ /* test mask */
+ styleold = GetWindowLongA(hwnd, GWL_STYLE);
+ ok(styleold & WS_VISIBLE, "expected WS_VISIBLE\n");
+ style = pSHSetWindowBits(hwnd, GWL_STYLE, WS_VISIBLE, 0);
+
+ ok(style == styleold, "expected previous style, got %x\n", style);
+ ok((GetWindowLongA(hwnd, GWL_STYLE) & WS_VISIBLE) == 0, "expected updated style\n");
+
+ /* test mask, unset style bit used */
+ styleold = GetWindowLongA(hwnd, GWL_STYLE);
+ style = pSHSetWindowBits(hwnd, GWL_STYLE, WS_VISIBLE, 0);
+ ok(style == styleold, "expected previous style, got %x\n", style);
+ ok(styleold == GetWindowLongA(hwnd, GWL_STYLE), "expected to keep old style\n");
+
+ /* set back with flags */
+ styleold = GetWindowLongA(hwnd, GWL_STYLE);
+ style = pSHSetWindowBits(hwnd, GWL_STYLE, WS_VISIBLE, WS_VISIBLE);
+ ok(style == styleold, "expected previous style, got %x\n", style);
+ ok(GetWindowLongA(hwnd, GWL_STYLE) & WS_VISIBLE, "expected updated style\n");
+
+ /* reset and try to set without a mask */
+ pSHSetWindowBits(hwnd, GWL_STYLE, WS_VISIBLE, 0);
+ ok((GetWindowLongA(hwnd, GWL_STYLE) & WS_VISIBLE) == 0, "expected updated style\n");
+ styleold = GetWindowLongA(hwnd, GWL_STYLE);
+ style = pSHSetWindowBits(hwnd, GWL_STYLE, 0, WS_VISIBLE);
+ ok(style == styleold, "expected previous style, got %x\n", style);
+ ok((GetWindowLongA(hwnd, GWL_STYLE) & WS_VISIBLE) == 0, "expected updated style\n");
+
+ DestroyWindow(hwnd);
+
+ UnregisterClassA("Shlwapi test class", GetModuleHandleA(NULL));
+}
+
+static void init_pointers(void)
+{
+#define MAKEFUNC(f, ord) (p##f = (void*)GetProcAddress(hShlwapi, (LPSTR)(ord)))
+ MAKEFUNC(SHAllocShared, 7);
+ MAKEFUNC(SHLockShared, 8);
+ MAKEFUNC(SHUnlockShared, 9);
+ MAKEFUNC(SHFreeShared, 10);
+ MAKEFUNC(GetAcceptLanguagesA, 14);
+ MAKEFUNC(SHSetWindowBits, 165);
+ MAKEFUNC(ConnectToConnectionPoint, 168);
+ MAKEFUNC(SHSearchMapInt, 198);
+ MAKEFUNC(SHPackDispParams, 282);
+ MAKEFUNC(IConnectionPoint_InvokeWithCancel, 283);
+ MAKEFUNC(IConnectionPoint_SimpleInvoke, 284);
+ MAKEFUNC(SHPropertyBag_ReadLONG, 496);
+#undef MAKEFUNC
+}
+
START_TEST(ordinal)
{
- hShlwapi = GetModuleHandleA("shlwapi.dll");
-
- pGetAcceptLanguagesA = (void*)GetProcAddress(hShlwapi, (LPSTR)14);
- pSHSearchMapInt = (void*)GetProcAddress(hShlwapi, (LPSTR)198);
- pSHAllocShared=(void*)GetProcAddress(hShlwapi,(char*)7);
- pSHLockShared=(void*)GetProcAddress(hShlwapi,(char*)8);
- pSHUnlockShared=(void*)GetProcAddress(hShlwapi,(char*)9);
- pSHFreeShared=(void*)GetProcAddress(hShlwapi,(char*)10);
- pSHPackDispParams=(void*)GetProcAddress(hShlwapi,(char*)282);
- pIConnectionPoint_SimpleInvoke=(void*)GetProcAddress(hShlwapi,(char*)284);
- pIConnectionPoint_InvokeWithCancel=(void*)GetProcAddress(hShlwapi,(char*)283);
- pConnectToConnectionPoint=(void*)GetProcAddress(hShlwapi,(char*)168);
- pSHPropertyBag_ReadLONG=(void*)GetProcAddress(hShlwapi,(char*)496);
-
- hmlang = LoadLibraryA("mlang.dll");
- pLcidToRfc1766A = (void *)GetProcAddress(hmlang, "LcidToRfc1766A");
-
- test_GetAcceptLanguagesA();
- test_SHSearchMapInt();
- test_alloc_shared();
- test_fdsa();
- test_GetShellSecurityDescriptor();
- test_SHPackDispParams();
- test_IConnectionPoint();
- test_SHPropertyBag_ReadLONG();
+ hShlwapi = GetModuleHandleA("shlwapi.dll");
+
+ init_pointers();
+
+ hmlang = LoadLibraryA("mlang.dll");
+ pLcidToRfc1766A = (void *)GetProcAddress(hmlang, "LcidToRfc1766A");
+
+ test_GetAcceptLanguagesA();
+ test_SHSearchMapInt();
+ test_alloc_shared();
+ test_fdsa();
+ test_GetShellSecurityDescriptor();
+ test_SHPackDispParams();
+ test_IConnectionPoint();
+ test_SHPropertyBag_ReadLONG();
+ test_SHSetWindowBits();
}
More information about the wine-cvs
mailing list