Jacek Caban : services/tests: Test creating windows inside non-interactive service.
Alexandre Julliard
julliard at winehq.org
Thu Feb 9 15:54:27 CST 2017
Module: wine
Branch: master
Commit: 2c24272804b57137fa051f1196e3b86904bc12cb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2c24272804b57137fa051f1196e3b86904bc12cb
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Feb 9 15:13:09 2017 +0100
services/tests: Test creating windows inside non-interactive service.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/services/tests/Makefile.in | 2 +-
programs/services/tests/service.c | 65 +++++++++++++++++++++++++++++++++++++
2 files changed, 66 insertions(+), 1 deletion(-)
diff --git a/programs/services/tests/Makefile.in b/programs/services/tests/Makefile.in
index b39e612..3abec74 100644
--- a/programs/services/tests/Makefile.in
+++ b/programs/services/tests/Makefile.in
@@ -1,5 +1,5 @@
TESTDLL = services.exe
-IMPORTS = advapi32
+IMPORTS = user32 advapi32
C_SRCS = \
service.c
diff --git a/programs/services/tests/service.c b/programs/services/tests/service.c
index 70f3262..0e9bcd7 100644
--- a/programs/services/tests/service.c
+++ b/programs/services/tests/service.c
@@ -19,6 +19,8 @@
#include <windef.h>
#include <winsvc.h>
#include <stdio.h>
+#include <winbase.h>
+#include <winuser.h>
#include "wine/test.h"
@@ -62,6 +64,67 @@ static void service_ok(int cnd, const char *msg, ...)
send_msg(cnd ? "OK" : "FAIL", buf);
}
+static void test_winstation(void)
+{
+ HWINSTA winstation;
+ USEROBJECTFLAGS flags;
+ BOOL r;
+
+ winstation = GetProcessWindowStation();
+ service_ok(winstation != NULL, "winstation = NULL\n");
+
+ r = GetUserObjectInformationA(winstation, UOI_FLAGS, &flags, sizeof(flags), NULL);
+ service_ok(r, "GetUserObjectInformation(UOI_NAME) failed: %u\n", GetLastError());
+ service_ok(!(flags.dwFlags & WSF_VISIBLE), "winstation has flags %x\n", flags.dwFlags);
+}
+
+/*
+ * Test creating window in a service process. Although services run in non-interactive,
+ * they may create windows that will never be visible.
+ */
+static void test_create_window(void)
+{
+ DWORD style;
+ ATOM class;
+ HWND hwnd;
+ BOOL r;
+
+ static WNDCLASSEXA wndclass = {
+ sizeof(WNDCLASSEXA),
+ 0,
+ DefWindowProcA,
+ 0, 0, NULL, NULL, NULL, NULL, NULL,
+ "service_test",
+ NULL
+ };
+
+ hwnd = GetDesktopWindow();
+ service_ok(IsWindow(hwnd), "GetDesktopWindow returned invalid window %p\n", hwnd);
+
+ class = RegisterClassExA(&wndclass);
+ service_ok(class, "RegisterClassFailed\n");
+
+ hwnd = CreateWindowA("service_test", "service_test",
+ WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
+ 515, 530, NULL, NULL, NULL, NULL);
+ service_ok(hwnd != NULL, "CreateWindow failed: %u\n", GetLastError());
+
+ style = GetWindowLongW(hwnd, GWL_STYLE);
+ service_ok(!(style & WS_VISIBLE), "style = %x, expected invisible\n", style);
+
+ r = ShowWindow(hwnd, SW_SHOW);
+ service_ok(!r, "ShowWindow returned %x\n", r);
+
+ style = GetWindowLongW(hwnd, GWL_STYLE);
+ service_ok(style & WS_VISIBLE, "style = %x, expected visible\n", style);
+
+ r = ShowWindow(hwnd, SW_SHOW);
+ service_ok(r, "ShowWindow returned %x\n", r);
+
+ r = DestroyWindow(hwnd);
+ service_ok(r, "DestroyWindow failed: %08x\n", GetLastError());
+}
+
static DWORD WINAPI service_handler(DWORD ctrl, DWORD event_type, void *event_data, void *context)
{
SERVICE_STATUS status;
@@ -84,6 +147,8 @@ static DWORD WINAPI service_handler(DWORD ctrl, DWORD event_type, void *event_da
SetEvent(service_stop_event);
return NO_ERROR;
case 128:
+ test_winstation();
+ test_create_window();
service_event("CUSTOM");
return 0xdeadbeef;
default:
More information about the wine-cvs
mailing list