Author: gadamopoulos Date: Tue Feb 4 10:41:02 2014 New Revision: 61971
URL: http://svn.reactos.org/svn/reactos?rev=61971&view=rev Log: [explorer_new] - Commit a great experiment for explorer. Our explorer will try to load a library called rshell.dll which will provide an alternative implementation of some functions that are built in in windows shell. These functions are CStartMenu_Constructor, SHCreateDesktop, SHDesktopMessageLoop, WinList_Init and ShellDDEInit. Providing our own implementation for these functions will allow us to make it run in all windows versions up to windows 8 and also test the implementation of our own components that will be placed temporarily in rshell.dll while they are developed and debugged in windows.
Added: branches/shell-experiments/base/shell/explorer-new/rshell.c (with props) Modified: branches/shell-experiments/base/shell/explorer-new/CMakeLists.txt branches/shell-experiments/base/shell/explorer-new/precomp.h branches/shell-experiments/base/shell/explorer-new/startmnu.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] Tue Feb 4 10:41:02 2014 @@ -1,3 +1,5 @@ + +PROJECT(SHELL)
add_definitions(-DWIN32)
@@ -5,6 +7,7 @@ desktop.c dragdrop.c explorer.c + rshell.c settings.c startmnu.c startup.c
Modified: branches/shell-experiments/base/shell/explorer-new/precomp.h URL: http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/exp... ============================================================================== --- branches/shell-experiments/base/shell/explorer-new/precomp.h [iso-8859-1] (original) +++ branches/shell-experiments/base/shell/explorer-new/precomp.h [iso-8859-1] Tue Feb 4 10:41:02 2014 @@ -167,6 +167,15 @@ IN LPCTSTR lpValue);
/* + * rshell.c + */ + +HRESULT +CStartMenu_Constructor( + REFIID riid, + void **ppv); + +/* * traywnd.c */
Added: branches/shell-experiments/base/shell/explorer-new/rshell.c URL: http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/exp... ============================================================================== --- branches/shell-experiments/base/shell/explorer-new/rshell.c (added) +++ branches/shell-experiments/base/shell/explorer-new/rshell.c [iso-8859-1] Tue Feb 4 10:41:02 2014 @@ -0,0 +1,162 @@ +/* + * ReactOS Explorer + * + * Copyright 2014 Giannis Adamopoulos + * + * 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" + +typedef HRESULT(*PSTARTMENU_CONSTRUCTOR)(REFIID riid, void **ppv); + +HRESULT +CStartMenu_Constructor( + REFIID riid, + void **ppv) +{ + HINSTANCE hRShell = LoadLibraryW(L"rshell.dll"); + + if (hRShell) + { + PSTARTMENU_CONSTRUCTOR func = (PSTARTMENU_CONSTRUCTOR)GetProcAddress(hRShell, "CStartMenu_Constructor"); + if(func) + { + return func(riid, ppv); + } + } + + return CoCreateInstance(&CLSID_StartMenu, + NULL, + CLSCTX_INPROC_SERVER, + riid, + ppv); +} + +typedef HANDLE(WINAPI *PSHCREATEDESKTOP)(IShellDesktopTray *ShellDesk); + +HANDLE WINAPI SHCreateDesktop(IShellDesktopTray *ShellDesk) +{ + HINSTANCE hRShell = LoadLibraryW(L"rshell.dll"); + + if (hRShell) + { + PSHCREATEDESKTOP func = (PSHCREATEDESKTOP)GetProcAddress(hRShell, "SHCreateDesktop"); + if (func) + { + return func(ShellDesk); + } + } + + hRShell = LoadLibraryW(L"shell32.dll"); + + if (hRShell) + { + PSHCREATEDESKTOP func = (PSHCREATEDESKTOP)GetProcAddress(hRShell, "SHCreateDesktop"); + if (func) + { + return func(ShellDesk); + } + } + + return 0; +} + +typedef BOOL(WINAPI *PSHDESKTOPMESSAGELOOP)(HANDLE hDesktop); + +BOOL WINAPI SHDesktopMessageLoop(HANDLE hDesktop) +{ + HINSTANCE hRShell = LoadLibraryW(L"rshell.dll"); + + if (hRShell) + { + PSHDESKTOPMESSAGELOOP func = (PSHDESKTOPMESSAGELOOP)GetProcAddress(hRShell, "SHDesktopMessageLoop"); + if (func) + { + return func(hDesktop); + } + } + + hRShell = LoadLibraryW(L"shell32.dll"); + + if (hRShell) + { + PSHDESKTOPMESSAGELOOP func = (PSHDESKTOPMESSAGELOOP)GetProcAddress(hRShell, "SHDesktopMessageLoop"); + if (func) + { + return func(hDesktop); + } + } + + return FALSE; +} + +typedef DWORD(WINAPI* PWINLIST_INIT)(void); + +DWORD WINAPI WinList_Init(void) +{ + HINSTANCE hRShell = LoadLibraryW(L"rshell.dll"); + + if (hRShell) + { + PWINLIST_INIT func = (PWINLIST_INIT)GetProcAddress(hRShell, "WinList_Init"); + if (func) + { + return func(); + } + } + + hRShell = LoadLibraryW(L"shdocvw.dll"); + + if (hRShell) + { + PWINLIST_INIT func = (PWINLIST_INIT)GetProcAddress(hRShell, "WinList_Init"); + if (func) + { + return func(); + } + } + + return 0; +} + +typedef void (WINAPI *PSHELLDDEINIT)(BOOL bInit); + +void WINAPI ShellDDEInit(BOOL bInit) +{ + HINSTANCE hRShell = LoadLibraryW(L"rshell.dll"); + + if (hRShell) + { + PSHELLDDEINIT func = (PSHELLDDEINIT)GetProcAddress(hRShell, "ShellDDEInit"); + if (func) + { + func(bInit); + return; + } + } + + hRShell = LoadLibraryW(L"shell32.dll"); + + if (hRShell) + { + PSHELLDDEINIT func = (PSHELLDDEINIT)GetProcAddress(hRShell, "ShellDDEInit"); + if (func) + { + func(bInit); + return; + } + } +}
Propchange: branches/shell-experiments/base/shell/explorer-new/rshell.c ------------------------------------------------------------------------------ svn:eol-style = native
Modified: branches/shell-experiments/base/shell/explorer-new/startmnu.c URL: http://svn.reactos.org/svn/reactos/branches/shell-experiments/base/shell/exp... ============================================================================== --- branches/shell-experiments/base/shell/explorer-new/startmnu.c [iso-8859-1] (original) +++ branches/shell-experiments/base/shell/explorer-new/startmnu.c [iso-8859-1] Tue Feb 4 10:41:02 2014 @@ -848,11 +848,15 @@ if (pSms == NULL) return NULL;
+#if 0 hr = CoCreateInstance(&CLSID_StartMenu, NULL, CLSCTX_INPROC_SERVER, &IID_IMenuPopup, (PVOID *)&pMp); +#else + hr = CStartMenu_Constructor(&IID_IMenuPopup,(PVOID *)&pMp); +#endif if (FAILED(hr)) { DbgPrint("CoCreateInstance failed: %x\n", hr);