[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

svn path=/branches/shell-experiments/; revision=63684
This commit is contained in:
David Quintana 2014-07-05 00:35:43 +00:00
parent e362a0da43
commit ca65a75bf4
4 changed files with 148 additions and 5 deletions

View file

@ -9,6 +9,7 @@ list(APPEND SOURCE
explorer.c explorer.c
rshell.c rshell.c
settings.c settings.c
shellservice.c
startmnu.c startmnu.c
startup.c startup.c
taskband.c taskband.c

View file

@ -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;
}

View file

@ -437,7 +437,7 @@ SysPagerWnd_NotifyMsg(IN HWND hwnd,
CopyMemory( CopyMemory(
&data, &data,
(PSYS_PAGER_COPY_DATA) cpData->lpData, (PSYS_PAGER_COPY_DATA) cpData->lpData,
cpData->dwData); cpData->cbData);
iconData = &data.nicon_data; iconData = &data.nicon_data;
switch (data.notify_code) switch (data.notify_code)

View file

@ -20,6 +20,9 @@
#include "precomp.h" #include "precomp.h"
extern HRESULT InitShellServices(HDPA * phdpa);
extern HRESULT ShutdownShellServices(HDPA hdpa);
static const TRAYWINDOW_CTXMENU TrayWindowCtxMenu; static const TRAYWINDOW_CTXMENU TrayWindowCtxMenu;
#define WM_APP_TRAYDESTROY (WM_APP + 0x100) #define WM_APP_TRAYDESTROY (WM_APP + 0x100)
@ -94,6 +97,8 @@ typedef struct
HWND hwndTrayPropertiesOwner; HWND hwndTrayPropertiesOwner;
HWND hwndRunFileDlgOwner; HWND hwndRunFileDlgOwner;
HDPA hdpaShellServices;
} ITrayWindowImpl; } ITrayWindowImpl;
BOOL LaunchCPanel(HWND hwnd, LPCTSTR applet) BOOL LaunchCPanel(HWND hwnd, LPCTSTR applet)
@ -660,6 +665,8 @@ ITrayWindowImpl_ResizeWorkArea(IN OUT ITrayWindowImpl *This)
{ {
RECT rcTray,rcWorkArea; RECT rcTray,rcWorkArea;
return;
/* If monitor has changed then fix the previous monitors work area */ /* If monitor has changed then fix the previous monitors work area */
if (This->PreviousMonitor != This->Monitor) if (This->PreviousMonitor != This->Monitor)
{ {
@ -768,10 +775,11 @@ ITrayWindowImpl_RegLoadSettings(IN OUT ITrayWindowImpl *This)
/* FIXME: Are there more flags? */ /* FIXME: Are there more flags? */
if (sr.Position > ABE_BOTTOM) //if (sr.Position > ABE_BOTTOM)
This->Position = ABE_BOTTOM; // This->Position = ABE_BOTTOM;
else //else
This->Position = sr.Position; // This->Position = sr.Position;
This->Position = ABE_LEFT;
/* Try to find out which monitor the tray window was located on last. /* 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 Here we're only interested in the monitor screen that we think
@ -986,6 +994,13 @@ ITrayWindowImpl_Destroy(ITrayWindowImpl *This)
(void)InterlockedExchangePointer((PVOID*)&This->hWnd, (void)InterlockedExchangePointer((PVOID*)&This->hWnd,
NULL); NULL);
if (This->hdpaShellServices != NULL)
{
ShutdownShellServices(This->hdpaShellServices);
This->hdpaShellServices = NULL;
}
if (This->himlStartBtn != NULL) if (This->himlStartBtn != NULL)
{ {
ImageList_Destroy(This->himlStartBtn); ImageList_Destroy(This->himlStartBtn);
@ -1586,6 +1601,8 @@ SetStartBtnImage:
/* Align all controls on the tray window */ /* Align all controls on the tray window */
ITrayWindowImpl_AlignControls(This, ITrayWindowImpl_AlignControls(This,
NULL); NULL);
InitShellServices(&(This->hdpaShellServices));
} }
static HRESULT STDMETHODCALLTYPE static HRESULT STDMETHODCALLTYPE