Author: dquintana Date: Sat Jul 5 00:35:43 2014 New Revision: 63684
URL: http://svn.reactos.org/svn/reactos?rev=63684&view=rev Log: [EXPLORER-NEW] * Fix a typo that broke tray notify icons. * Implement loading of Shell Service Objects. Works in win2003 but no idea if it works in ros since we don't have any SSO implemented yet ;P
Added: branches/shell-experiments/base/shell/explorer-new/shellservice.c (with props) Modified: branches/shell-experiments/base/shell/explorer-new/CMakeLists.txt branches/shell-experiments/base/shell/explorer-new/trayntfy.c branches/shell-experiments/base/shell/explorer-new/traywnd.c
Modified: branches/shell-experiments/base/shell/explorer-new/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/exp... ============================================================================== --- branches/shell-experiments/base/shell/explorer-new/CMakeLists.txt [iso-8859-1] (original) +++ branches/shell-experiments/base/shell/explorer-new/CMakeLists.txt [iso-8859-1] Sat Jul 5 00:35:43 2014 @@ -9,6 +9,7 @@ explorer.c rshell.c settings.c + shellservice.c startmnu.c startup.c taskband.c
Added: branches/shell-experiments/base/shell/explorer-new/shellservice.c URL: http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/exp... ============================================================================== --- branches/shell-experiments/base/shell/explorer-new/shellservice.c (added) +++ branches/shell-experiments/base/shell/explorer-new/shellservice.c [iso-8859-1] Sat Jul 5 00:35:43 2014 @@ -0,0 +1,125 @@ +/* +* ReactOS Explorer +* +* Copyright 2014 - David Quintana +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "precomp.h" + +extern HRESULT InitShellServices(HDPA * phdpa); +extern HRESULT ShutdownShellServices(HDPA hdpa); + +static int CALLBACK InitializeAllCallback(void* pItem, void* pData) +{ + IOleCommandTarget * pOct = pItem; + HRESULT * phr = pData; + *phr = IOleCommandTarget_Exec(pOct, &CGID_ShellServiceObject, OLECMDID_NEW, OLECMDEXECOPT_DODEFAULT, NULL, NULL); + return SUCCEEDED(*phr); +} + +static int CALLBACK ShutdownAllCallback(void* pItem, void* pData) +{ + IOleCommandTarget * pOct = pItem; + IOleCommandTarget_Exec(pOct, &CGID_ShellServiceObject, OLECMDID_SAVE, OLECMDEXECOPT_DODEFAULT, NULL, NULL); + return TRUE; +} + +static int CALLBACK DeleteAllEnumCallback(void* pItem, void* pData) +{ + IOleCommandTarget * pOct = pItem; + IUnknown_Release(pOct); + return TRUE; +} + +HRESULT InitShellServices(HDPA * phdpa) +{ + IOleCommandTarget * pOct; + HKEY hkey; + CLSID clsid; + WCHAR name[MAX_PATH]; + WCHAR value[MAX_PATH]; + DWORD type; + LONG ret; + HDPA hdpa; + HRESULT hr = S_OK; + int count = 0; + + hdpa = DPA_Create(5); + + if (RegOpenKey(HKEY_LOCAL_MACHINE, + L"SOFTWARE\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad", + &hkey)) + { + return HRESULT_FROM_WIN32(GetLastError()); + } + + /* Enumerate */ + do + { + DWORD name_len = MAX_PATH; + DWORD value_len = sizeof(value); /* byte count! */ + + ret = RegEnumValueW(hkey, count, name, &name_len, 0, &type, (LPBYTE) &value, &value_len); + if (ret) + break; + + if (type != REG_SZ) + continue; + + hr = CLSIDFromString(value, &clsid); + if (FAILED(hr)) + goto cleanup; + + hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IOleCommandTarget, (VOID**) &pOct); + if (FAILED(hr)) + goto cleanup; + + DPA_AppendPtr(hdpa, pOct); + + count++; + } + while (1); + + if (ret != ERROR_NO_MORE_ITEMS) + { + hr = HRESULT_FROM_WIN32(GetLastError()); + goto cleanup; + } + + RegCloseKey(hkey); + + /* Initialize */ + DPA_EnumCallback(hdpa, InitializeAllCallback, &hr); + if (FAILED(hr)) + goto cleanup; + + *phdpa = hdpa; + return count > 0 ? S_OK : S_FALSE; + +cleanup: + *phdpa = NULL; + ShutdownShellServices(hdpa); + return hr; +} + +HRESULT ShutdownShellServices(HDPA hdpa) +{ + DPA_EnumCallback(hdpa, ShutdownAllCallback, NULL); + DPA_EnumCallback(hdpa, DeleteAllEnumCallback, NULL); + DPA_Destroy(hdpa); + return S_OK; +}
Propchange: branches/shell-experiments/base/shell/explorer-new/shellservice.c ------------------------------------------------------------------------------ svn:eol-style = native
Modified: branches/shell-experiments/base/shell/explorer-new/trayntfy.c URL: http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/exp... ============================================================================== --- branches/shell-experiments/base/shell/explorer-new/trayntfy.c [iso-8859-1] (original) +++ branches/shell-experiments/base/shell/explorer-new/trayntfy.c [iso-8859-1] Sat Jul 5 00:35:43 2014 @@ -437,7 +437,7 @@ CopyMemory( &data, (PSYS_PAGER_COPY_DATA) cpData->lpData, - cpData->dwData); + cpData->cbData); iconData = &data.nicon_data;
switch (data.notify_code)
Modified: branches/shell-experiments/base/shell/explorer-new/traywnd.c URL: http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/exp... ============================================================================== --- branches/shell-experiments/base/shell/explorer-new/traywnd.c [iso-8859-1] (original) +++ branches/shell-experiments/base/shell/explorer-new/traywnd.c [iso-8859-1] Sat Jul 5 00:35:43 2014 @@ -20,6 +20,9 @@
#include "precomp.h"
+extern HRESULT InitShellServices(HDPA * phdpa); +extern HRESULT ShutdownShellServices(HDPA hdpa); + static const TRAYWINDOW_CTXMENU TrayWindowCtxMenu;
#define WM_APP_TRAYDESTROY (WM_APP + 0x100) @@ -94,6 +97,8 @@
HWND hwndTrayPropertiesOwner; HWND hwndRunFileDlgOwner; + + HDPA hdpaShellServices; } ITrayWindowImpl;
BOOL LaunchCPanel(HWND hwnd, LPCTSTR applet) @@ -659,6 +664,8 @@ ITrayWindowImpl_ResizeWorkArea(IN OUT ITrayWindowImpl *This) { RECT rcTray,rcWorkArea; + + return;
/* If monitor has changed then fix the previous monitors work area */ if (This->PreviousMonitor != This->Monitor) @@ -768,10 +775,11 @@
/* FIXME: Are there more flags? */
- if (sr.Position > ABE_BOTTOM) - This->Position = ABE_BOTTOM; - else - This->Position = sr.Position; + //if (sr.Position > ABE_BOTTOM) + // This->Position = ABE_BOTTOM; + //else + // This->Position = sr.Position; + This->Position = ABE_LEFT;
/* Try to find out which monitor the tray window was located on last. Here we're only interested in the monitor screen that we think @@ -985,6 +993,13 @@ { (void)InterlockedExchangePointer((PVOID*)&This->hWnd, NULL); + + + if (This->hdpaShellServices != NULL) + { + ShutdownShellServices(This->hdpaShellServices); + This->hdpaShellServices = NULL; + }
if (This->himlStartBtn != NULL) { @@ -1586,6 +1601,8 @@ /* Align all controls on the tray window */ ITrayWindowImpl_AlignControls(This, NULL); + + InitShellServices(&(This->hdpaShellServices)); }
static HRESULT STDMETHODCALLTYPE