2 * PROJECT: ReactOS system libraries
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll\win32\stobject\stobject.cpp
5 * PURPOSE: COM registration services for STobject.dll
6 * PROGRAMMERS: Robert Naumann
7 David Quintana <gigaherz@gmail.com>
15 WINE_DEFAULT_DEBUG_CHANNEL(stobject
);
17 BEGIN_OBJECT_MAP(ObjectMap
)
18 OBJECT_ENTRY(CLSID_SysTray
, CSysTray
)
21 class CShellTrayModule
: public CComModule
26 HINSTANCE g_hInstance
;
27 CShellTrayModule g_Module
;
28 SysTrayIconHandlers_t g_IconHandlers
[] = {
29 { Volume_Init
, Volume_Shutdown
, Volume_Update
, Volume_Message
}
31 const int g_NumIcons
= _countof(g_IconHandlers
);
33 void *operator new (size_t, void *buf
)
40 DllMain(HINSTANCE hinstDLL
, DWORD fdwReason
, LPVOID fImpLoad
)
42 if (fdwReason
== DLL_PROCESS_ATTACH
)
44 g_hInstance
= hinstDLL
;
45 DisableThreadLibraryCalls(g_hInstance
);
47 /* HACK - the global constructors don't run, so I placement new them here */
48 new (&g_Module
) CShellTrayModule
;
49 new (&_AtlWinModule
) CAtlWinModule
;
50 new (&_AtlBaseModule
) CAtlBaseModule
;
51 new (&_AtlComModule
) CAtlComModule
;
53 g_Module
.Init(ObjectMap
, g_hInstance
, NULL
);
55 else if (fdwReason
== DLL_PROCESS_DETACH
)
65 RegisterShellServiceObject(REFGUID guidClass
, LPCWSTR lpName
, BOOL bRegister
)
67 const LPCWSTR strRegistryLocation
= L
"Software\\Microsoft\\Windows\\CurrentVersion\\ShellServiceObjectDelayLoad";
75 if (!StringFromGUID2(guidClass
, strGuid
, _countof(strGuid
)))
77 DbgPrint("StringFromGUID2 failed\n");
81 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, strRegistryLocation
, 0, KEY_WRITE
, &hKey
))
83 DbgPrint("RegOpenKeyExW failed\n");
89 LONG cbGuid
= (lstrlenW(strGuid
) + 1) * 2;
90 if (RegSetValueExW(hKey
, lpName
, 0, REG_SZ
, (const BYTE
*) strGuid
, cbGuid
))
92 DbgPrint("RegSetValueExW failed\n");
98 if (RegDeleteValueW(hKey
, lpName
))
100 DbgPrint("RegDeleteValueW failed\n");
115 DllRegisterServer(void)
119 hr
= g_Module
.DllRegisterServer(FALSE
);
120 if (FAILED_UNEXPECTEDLY(hr
))
123 hr
= RegisterShellServiceObject(CLSID_SysTray
, L
"SysTray", TRUE
);
124 if (FAILED_UNEXPECTEDLY(hr
))
131 DllUnregisterServer(void)
135 hr
= RegisterShellServiceObject(CLSID_SysTray
, L
"SysTray", FALSE
);
136 if (FAILED_UNEXPECTEDLY(hr
))
139 hr
= g_Module
.DllUnregisterServer(FALSE
);
140 if (FAILED_UNEXPECTEDLY(hr
))
147 DllGetClassObject(REFCLSID rclsid
, REFIID riid
, LPVOID
*ppv
)
151 hr
= g_Module
.DllGetClassObject(rclsid
, riid
, ppv
);
152 if (FAILED_UNEXPECTEDLY(hr
))
160 DllCanUnloadNow(void)
162 return g_Module
.DllCanUnloadNow();