mirror of
https://github.com/reactos/reactos.git
synced 2025-01-01 03:54:02 +00:00
[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:
parent
e362a0da43
commit
ca65a75bf4
4 changed files with 148 additions and 5 deletions
|
@ -9,6 +9,7 @@ list(APPEND SOURCE
|
|||
explorer.c
|
||||
rshell.c
|
||||
settings.c
|
||||
shellservice.c
|
||||
startmnu.c
|
||||
startup.c
|
||||
taskband.c
|
||||
|
|
125
base/shell/explorer-new/shellservice.c
Normal file
125
base/shell/explorer-new/shellservice.c
Normal 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;
|
||||
}
|
|
@ -437,7 +437,7 @@ SysPagerWnd_NotifyMsg(IN HWND hwnd,
|
|||
CopyMemory(
|
||||
&data,
|
||||
(PSYS_PAGER_COPY_DATA) cpData->lpData,
|
||||
cpData->dwData);
|
||||
cpData->cbData);
|
||||
iconData = &data.nicon_data;
|
||||
|
||||
switch (data.notify_code)
|
||||
|
|
|
@ -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 @@ typedef struct
|
|||
|
||||
HWND hwndTrayPropertiesOwner;
|
||||
HWND hwndRunFileDlgOwner;
|
||||
|
||||
HDPA hdpaShellServices;
|
||||
} ITrayWindowImpl;
|
||||
|
||||
BOOL LaunchCPanel(HWND hwnd, LPCTSTR applet)
|
||||
|
@ -660,6 +665,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 @@ ITrayWindowImpl_RegLoadSettings(IN OUT ITrayWindowImpl *This)
|
|||
|
||||
/* 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
|
||||
|
@ -986,6 +994,13 @@ ITrayWindowImpl_Destroy(ITrayWindowImpl *This)
|
|||
(void)InterlockedExchangePointer((PVOID*)&This->hWnd,
|
||||
NULL);
|
||||
|
||||
|
||||
if (This->hdpaShellServices != NULL)
|
||||
{
|
||||
ShutdownShellServices(This->hdpaShellServices);
|
||||
This->hdpaShellServices = NULL;
|
||||
}
|
||||
|
||||
if (This->himlStartBtn != NULL)
|
||||
{
|
||||
ImageList_Destroy(This->himlStartBtn);
|
||||
|
@ -1586,6 +1601,8 @@ SetStartBtnImage:
|
|||
/* Align all controls on the tray window */
|
||||
ITrayWindowImpl_AlignControls(This,
|
||||
NULL);
|
||||
|
||||
InitShellServices(&(This->hdpaShellServices));
|
||||
}
|
||||
|
||||
static HRESULT STDMETHODCALLTYPE
|
||||
|
|
Loading…
Reference in a new issue