diff --git a/base/shell/explorer-new/CMakeLists.txt b/base/shell/explorer-new/CMakeLists.txt index 5d62d56920c..797d33dd13c 100644 --- a/base/shell/explorer-new/CMakeLists.txt +++ b/base/shell/explorer-new/CMakeLists.txt @@ -1,10 +1,13 @@ +PROJECT(SHELL) + add_definitions(-DWIN32) list(APPEND SOURCE desktop.c dragdrop.c explorer.c + rshell.c settings.c startmnu.c startup.c diff --git a/base/shell/explorer-new/precomp.h b/base/shell/explorer-new/precomp.h index ad2bfc9944a..7c67c9a2fcd 100644 --- a/base/shell/explorer-new/precomp.h +++ b/base/shell/explorer-new/precomp.h @@ -166,6 +166,15 @@ GetExplorerRegValueSet(IN HKEY hKey, IN LPCTSTR lpSubKey, IN LPCTSTR lpValue); +/* + * rshell.c + */ + +HRESULT +CStartMenu_Constructor( + REFIID riid, + void **ppv); + /* * traywnd.c */ diff --git a/base/shell/explorer-new/rshell.c b/base/shell/explorer-new/rshell.c new file mode 100644 index 00000000000..e6b287cc91f --- /dev/null +++ b/base/shell/explorer-new/rshell.c @@ -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; + } + } +} \ No newline at end of file diff --git a/base/shell/explorer-new/startmnu.c b/base/shell/explorer-new/startmnu.c index 845f53835e9..bcfc662886f 100644 --- a/base/shell/explorer-new/startmnu.c +++ b/base/shell/explorer-new/startmnu.c @@ -848,11 +848,15 @@ CreateStartMenu(IN ITrayWindow *Tray, 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);