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/ex…
==============================================================================
--- 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/ex…
==============================================================================
--- 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/ex…
==============================================================================
--- 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/ex…
==============================================================================
--- 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);