From e5ac3d04ebfad65461ff202336d3b70ee383fd7b Mon Sep 17 00:00:00 2001 From: David Quintana Date: Wed, 23 Jul 2014 18:00:36 +0000 Subject: [PATCH] [STOBJECT] * Create skeleton for the SysTray shell service object DLL. No tray icons are created yet. * Tranks Robert Naumann for providing the icon resources, and some file templates. svn path=/branches/shell-experiments/; revision=63732 --- base/shell/rshell/CStartMenu.cpp | 2 + dll/win32/CMakeLists.txt | 1 + dll/win32/stobject/CMakeLists.txt | 36 ++++ dll/win32/stobject/lang/de-DE.rc | 2 + dll/win32/stobject/lang/en-US.rc | 1 + dll/win32/stobject/precomp.h | 75 +++++++++ dll/win32/stobject/resource.h | 8 + dll/win32/stobject/resources/1.ico | Bin 0 -> 25214 bytes dll/win32/stobject/resources/2.ico | Bin 0 -> 25214 bytes dll/win32/stobject/resources/3.ico | Bin 0 -> 26686 bytes dll/win32/stobject/resources/4.ico | Bin 0 -> 25214 bytes dll/win32/stobject/resources/rgs/systray.rgs | 13 ++ dll/win32/stobject/stobject.cpp | 165 +++++++++++++++++++ dll/win32/stobject/stobject.rc | 26 +++ dll/win32/stobject/stobject.spec | 4 + 15 files changed, 333 insertions(+) create mode 100644 dll/win32/stobject/CMakeLists.txt create mode 100644 dll/win32/stobject/lang/de-DE.rc create mode 100644 dll/win32/stobject/lang/en-US.rc create mode 100644 dll/win32/stobject/precomp.h create mode 100644 dll/win32/stobject/resource.h create mode 100644 dll/win32/stobject/resources/1.ico create mode 100644 dll/win32/stobject/resources/2.ico create mode 100644 dll/win32/stobject/resources/3.ico create mode 100644 dll/win32/stobject/resources/4.ico create mode 100644 dll/win32/stobject/resources/rgs/systray.rgs create mode 100644 dll/win32/stobject/stobject.cpp create mode 100644 dll/win32/stobject/stobject.rc create mode 100644 dll/win32/stobject/stobject.spec diff --git a/base/shell/rshell/CStartMenu.cpp b/base/shell/rshell/CStartMenu.cpp index 649086beb33..dfefa3fad52 100644 --- a/base/shell/rshell/CStartMenu.cpp +++ b/base/shell/rshell/CStartMenu.cpp @@ -412,6 +412,8 @@ CStartMenu_Constructor(REFIID riid, void **ppv) return hr; hr = SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &pidlProgramsAbsolute); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; pidlPrograms = ILClone(ILFindLastID(pidlProgramsAbsolute)); ILFree(pidlProgramsAbsolute); diff --git a/dll/win32/CMakeLists.txt b/dll/win32/CMakeLists.txt index 3355a269c2d..ade507f12f4 100644 --- a/dll/win32/CMakeLists.txt +++ b/dll/win32/CMakeLists.txt @@ -193,6 +193,7 @@ add_subdirectory(srclient) add_subdirectory(stdole2.tlb) add_subdirectory(stdole32.tlb) add_subdirectory(sti) +add_subdirectory(stobject) add_subdirectory(sxs) add_subdirectory(syssetup) add_subdirectory(t2embed) diff --git a/dll/win32/stobject/CMakeLists.txt b/dll/win32/stobject/CMakeLists.txt new file mode 100644 index 00000000000..5b0f24b0734 --- /dev/null +++ b/dll/win32/stobject/CMakeLists.txt @@ -0,0 +1,36 @@ + +project(SHELL) + +set_cpp(WITH_RUNTIME) + +if(NOT MSVC) + # HACK: this should be enabled globally! + add_compile_flags_language("-std=c++11" "CXX") +endif() + +include_directories( + ${REACTOS_SOURCE_DIR}/lib/atl + ${REACTOS_SOURCE_DIR}) + +spec2def(stobject.dll stobject.spec) + +add_library(stobject SHARED + stobject.cpp + stobject.rc + ${CMAKE_CURRENT_BINARY_DIR}/stobject.def) + +set_module_type(stobject win32dll UNICODE) +target_link_libraries(stobject uuid wine atlnew) + +add_importlibs(stobject + advapi32 + ole32 + gdi32 + user32 + comctl32 + shlwapi + msvcrt + kernel32 + ntdll) + +add_cd_file(TARGET stobject DESTINATION reactos/system32 FOR all) diff --git a/dll/win32/stobject/lang/de-DE.rc b/dll/win32/stobject/lang/de-DE.rc new file mode 100644 index 00000000000..0e573487217 --- /dev/null +++ b/dll/win32/stobject/lang/de-DE.rc @@ -0,0 +1,2 @@ +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + diff --git a/dll/win32/stobject/lang/en-US.rc b/dll/win32/stobject/lang/en-US.rc new file mode 100644 index 00000000000..53b8ea9b4de --- /dev/null +++ b/dll/win32/stobject/lang/en-US.rc @@ -0,0 +1 @@ +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US diff --git a/dll/win32/stobject/precomp.h b/dll/win32/stobject/precomp.h new file mode 100644 index 00000000000..3f14fd1eb0e --- /dev/null +++ b/dll/win32/stobject/precomp.h @@ -0,0 +1,75 @@ +#pragma once + +#define WIN32_NO_STATUS +#include +#include + +#define COBJMACROS +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H +#define NTOS_MODE_USER + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +extern const GUID CLSID_SysTray; + +#include "resource.h" + +static __inline ULONG +Win32DbgPrint(const char *filename, int line, const char *lpFormat, ...) +{ + char szMsg[512]; + char *szMsgStart; + const char *fname; + va_list vl; + ULONG uRet; + + fname = strrchr(filename, '\\'); + if (fname == NULL) + { + fname = strrchr(filename, '/'); + } + + if (fname == NULL) + fname = filename; + else + fname++; + + szMsgStart = szMsg + sprintf(szMsg, "[%10lu] %s:%d: ", GetTickCount(), fname, line); + + va_start(vl, lpFormat); + uRet = (ULONG) vsprintf(szMsgStart, lpFormat, vl); + va_end(vl); + + OutputDebugStringA(szMsg); + + return uRet; +} + +#define DbgPrint(fmt, ...) \ + Win32DbgPrint(__FILE__, __LINE__, fmt, ##__VA_ARGS__) + +#if 1 +#define FAILED_UNEXPECTEDLY(hr) (FAILED(hr) && (DbgPrint("Unexpected failure %08x.\n", hr), TRUE)) +#else +#define FAILED_UNEXPECTEDLY(hr) FAILED(hr) +#endif + diff --git a/dll/win32/stobject/resource.h b/dll/win32/stobject/resource.h new file mode 100644 index 00000000000..242929678c7 --- /dev/null +++ b/dll/win32/stobject/resource.h @@ -0,0 +1,8 @@ +#pragma once + +#define IDI_ICON1 200 +#define IDI_ICON2 210 +#define IDI_ICON3 230 +#define IDI_ICON4 231 + +#define IDR_SYSTRAY 11001 diff --git a/dll/win32/stobject/resources/1.ico b/dll/win32/stobject/resources/1.ico new file mode 100644 index 0000000000000000000000000000000000000000..9f051006742ef2fe4870cd4c0e8023be49a9ad92 GIT binary patch literal 25214 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 literal 0 HcmV?d00001 diff --git a/dll/win32/stobject/resources/2.ico b/dll/win32/stobject/resources/2.ico new file mode 100644 index 0000000000000000000000000000000000000000..d2c4f8571874a86dfeeab048255298ee3b9e308b GIT binary patch literal 25214 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 F{s(g3e;xn; literal 0 HcmV?d00001 diff --git a/dll/win32/stobject/resources/3.ico b/dll/win32/stobject/resources/3.ico new file mode 100644 index 0000000000000000000000000000000000000000..3aba11dfd88db60d478eb7caa2ca59002c590713 GIT binary patch literal 26686 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 literal 0 HcmV?d00001 diff --git a/dll/win32/stobject/resources/4.ico b/dll/win32/stobject/resources/4.ico new file mode 100644 index 0000000000000000000000000000000000000000..fdde85a086bfd24d06659645fdcca06a5d117d14 GIT binary patch literal 25214 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 literal 0 HcmV?d00001 diff --git a/dll/win32/stobject/resources/rgs/systray.rgs b/dll/win32/stobject/resources/rgs/systray.rgs new file mode 100644 index 00000000000..2b70f2e2bc7 --- /dev/null +++ b/dll/win32/stobject/resources/rgs/systray.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove CLSID + { + ForceRemove {35CEC8A3-2BE6-11D2-8773-92E220524153} = s 'SysTray' + { + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Both' + } + } + } +} diff --git a/dll/win32/stobject/stobject.cpp b/dll/win32/stobject/stobject.cpp new file mode 100644 index 00000000000..5453652e6e3 --- /dev/null +++ b/dll/win32/stobject/stobject.cpp @@ -0,0 +1,165 @@ +/* + * PROJECT: ReactOS system libraries + * LICENSE: GPL - See COPYING in the top level directory + * FILE: dll\win32\stobject\stobject.c + * PURPOSE: Systray shell service object + * PROGRAMMERS: Copyright 2014 Robert Naumann + */ + +#include "precomp.h" + +#include + +WINE_DEFAULT_DEBUG_CHANNEL(stobject); + +const GUID CLSID_SysTray = { 0x35CEC8A3, 0x2BE6, 0x11D2, { 0x87, 0x73, 0x92, 0xE2, 0x20, 0x52, 0x41, 0x53 } }; + +class CShellTrayModule : public CComModule +{ +public: +}; + +class CSysTray : + public CComCoClass, + public CComObjectRootEx, + public IOleCommandTarget +{ + // TODO: keep icon handlers here + +public: + CSysTray() {} + virtual ~CSysTray() {} + + // *** IOleCommandTarget methods *** + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText) + { + UNIMPLEMENTED; + return S_OK; + } + + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) + { + if (!IsEqualGUID(*pguidCmdGroup, CGID_ShellServiceObject)) + return E_FAIL; + + switch (nCmdID) + { + case OLECMDID_NEW: // init + DbgPrint("CSysTray Init TODO: Initialize tray icon handlers.\n"); + break; + case OLECMDID_SAVE: // shutdown + DbgPrint("CSysTray Shutdown TODO: Shutdown.\n"); + break; + } + return S_OK; + } + + DECLARE_REGISTRY_RESOURCEID(IDR_SYSTRAY) + DECLARE_NOT_AGGREGATABLE(CSysTray) + DECLARE_PROTECT_FINAL_CONSTRUCT() + + BEGIN_COM_MAP(CSysTray) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) + END_COM_MAP() +}; + + +BEGIN_OBJECT_MAP(ObjectMap) + OBJECT_ENTRY(CLSID_SysTray, CSysTray) +END_OBJECT_MAP() + +CShellTrayModule gModule; + +HINSTANCE g_hInstance; + +HRESULT RegisterShellServiceObject(REFGUID guidClass, LPCWSTR lpName, BOOL bRegister) +{ + const LPCWSTR strRegistryLocation = L"Software\\Microsoft\\Windows\\CurrentVersion\\ShellServiceObjectDelayLoad"; + + OLECHAR strGuid[128]; // shouldn't need so much! + LSTATUS ret = 0; + HKEY hKey = 0; + if (StringFromGUID2(guidClass, strGuid, 128)) + { + if (!RegOpenKeyExW(HKEY_LOCAL_MACHINE, strRegistryLocation, 0, KEY_WRITE, &hKey)) + { + if (bRegister) + { + LONG cbGuid = (lstrlenW(strGuid) + 1) * 2; + ret = RegSetValueExW(hKey, lpName, 0, REG_SZ, (const BYTE *) strGuid, cbGuid); + } + else + { + ret = RegDeleteValueW(hKey, lpName); + } + } + } + if (hKey) + RegCloseKey(hKey); + return /*HRESULT_FROM_NT*/(ret); // regsvr32 considers anything != S_OK to be an error + +} + +void *operator new (size_t, void *buf) +{ + return buf; +} + +BOOL +WINAPI +DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) +{ + if (fdwReason == DLL_PROCESS_ATTACH) + { + /* HACK - the global constructors don't run, so I placement new them here */ + new (&gModule) CShellTrayModule; + new (&_AtlWinModule) CAtlWinModule; + new (&_AtlBaseModule) CAtlBaseModule; + new (&_AtlComModule) CAtlComModule; + + g_hInstance = hinstDLL; + DisableThreadLibraryCalls(g_hInstance); + + gModule.Init(ObjectMap, g_hInstance, NULL); + } + else if (fdwReason == DLL_PROCESS_DETACH) + { + g_hInstance = NULL; + gModule.Term(); + } + return TRUE; +} + +HRESULT +WINAPI +DllCanUnloadNow(void) +{ + return gModule.DllCanUnloadNow(); +} + +STDAPI +DllRegisterServer(void) +{ + HRESULT hr = gModule.DllRegisterServer(FALSE); + if (FAILED(hr)) + return hr; + + return RegisterShellServiceObject(CLSID_SysTray, L"SysTray", TRUE); +} + +STDAPI +DllUnregisterServer(void) +{ + RegisterShellServiceObject(CLSID_SysTray, L"SysTray", FALSE); + + return gModule.DllUnregisterServer(FALSE); +} + +STDAPI +DllGetClassObject( + REFCLSID rclsid, + REFIID riid, + LPVOID *ppv) +{ + return gModule.DllGetClassObject(rclsid, riid, ppv); +} diff --git a/dll/win32/stobject/stobject.rc b/dll/win32/stobject/stobject.rc new file mode 100644 index 00000000000..e47b00063dd --- /dev/null +++ b/dll/win32/stobject/stobject.rc @@ -0,0 +1,26 @@ +#include +#include +#include + +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +IDI_ICON1 ICON "resources/1.ico" +IDI_ICON2 ICON "resources/2.ico" +IDI_ICON3 ICON "resources/3.ico" +IDI_ICON4 ICON "resources/4.ico" + +IDR_SYSTRAY REGISTRY "resources/rgs/systray.rgs" + +/* UTF-8 */ +#pragma code_page(65001) + +#if 0 +#ifdef LANGUAGE_DE_DE + #include "lang/de-DE.rc" +#endif +#ifdef LANGUAGE_EN_US + #include "lang/en-US.rc" +#endif +#endif diff --git a/dll/win32/stobject/stobject.spec b/dll/win32/stobject/stobject.spec new file mode 100644 index 00000000000..069be116271 --- /dev/null +++ b/dll/win32/stobject/stobject.spec @@ -0,0 +1,4 @@ +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) +@ stdcall -private DllRegisterServer() +@ stdcall -private DllUnregisterServer() \ No newline at end of file