[EXPLORER-NEW]

* Fix the fallback for when rshell functions are not exported or rshell is not present.
* While at it, avoid unnecessary calls to LoadLibrary.

svn path=/branches/shell-experiments/; revision=63357
This commit is contained in:
David Quintana 2014-05-18 18:05:16 +00:00
parent a55f7c589b
commit a8667b0ffe

View file

@ -20,14 +20,16 @@
#include "precomp.h" #include "precomp.h"
static HINSTANCE hRShell = NULL;
typedef HRESULT(*PSTARTMENU_CONSTRUCTOR)(REFIID riid, void **ppv); typedef HRESULT(*PSTARTMENU_CONSTRUCTOR)(REFIID riid, void **ppv);
HRESULT HRESULT CStartMenu_Constructor(REFIID riid, void **ppv)
CStartMenu_Constructor(
REFIID riid,
void **ppv)
{ {
HINSTANCE hRShell = LoadLibraryW(L"rshell.dll"); if (!hRShell)
{
hRShell = LoadLibraryW(L"rshell.dll");
}
if (hRShell) if (hRShell)
{ {
@ -49,7 +51,12 @@ typedef HANDLE(WINAPI *PSHCREATEDESKTOP)(IShellDesktopTray *ShellDesk);
HANDLE WINAPI SHCreateDesktop(IShellDesktopTray *ShellDesk) HANDLE WINAPI SHCreateDesktop(IShellDesktopTray *ShellDesk)
{ {
HINSTANCE hRShell = LoadLibraryW(L"rshell.dll"); HINSTANCE hFallback;
if (!hRShell)
{
hRShell = LoadLibraryW(L"rshell.dll");
}
if (hRShell) if (hRShell)
{ {
@ -60,11 +67,11 @@ HANDLE WINAPI SHCreateDesktop(IShellDesktopTray *ShellDesk)
} }
} }
hRShell = LoadLibraryW(L"shell32.dll"); hFallback = GetModuleHandleW(L"shell32.dll");
if (hRShell) if (hFallback)
{ {
PSHCREATEDESKTOP func = (PSHCREATEDESKTOP)GetProcAddress(hRShell, "SHCreateDesktop"); PSHCREATEDESKTOP func = (PSHCREATEDESKTOP) GetProcAddress(hFallback, (LPCSTR) 200);
if (func) if (func)
{ {
return func(ShellDesk); return func(ShellDesk);
@ -78,7 +85,12 @@ typedef BOOL(WINAPI *PSHDESKTOPMESSAGELOOP)(HANDLE hDesktop);
BOOL WINAPI SHDesktopMessageLoop(HANDLE hDesktop) BOOL WINAPI SHDesktopMessageLoop(HANDLE hDesktop)
{ {
HINSTANCE hRShell = LoadLibraryW(L"rshell.dll"); HINSTANCE hFallback;
if (!hRShell)
{
hRShell = LoadLibraryW(L"rshell.dll");
}
if (hRShell) if (hRShell)
{ {
@ -89,11 +101,11 @@ BOOL WINAPI SHDesktopMessageLoop(HANDLE hDesktop)
} }
} }
hRShell = LoadLibraryW(L"shell32.dll"); hFallback = GetModuleHandleW(L"shell32.dll");
if (hRShell) if (hFallback)
{ {
PSHDESKTOPMESSAGELOOP func = (PSHDESKTOPMESSAGELOOP)GetProcAddress(hRShell, "SHDesktopMessageLoop"); PSHDESKTOPMESSAGELOOP func = (PSHDESKTOPMESSAGELOOP) GetProcAddress(hFallback, (LPCSTR) 201);
if (func) if (func)
{ {
return func(hDesktop); return func(hDesktop);
@ -107,7 +119,12 @@ typedef DWORD(WINAPI* PWINLIST_INIT)(void);
DWORD WINAPI WinList_Init(void) DWORD WINAPI WinList_Init(void)
{ {
HINSTANCE hRShell = LoadLibraryW(L"rshell.dll"); HINSTANCE hFallback;
if (!hRShell)
{
hRShell = LoadLibraryW(L"rshell.dll");
}
if (hRShell) if (hRShell)
{ {
@ -118,11 +135,11 @@ DWORD WINAPI WinList_Init(void)
} }
} }
hRShell = LoadLibraryW(L"shdocvw.dll"); hFallback = GetModuleHandleW(L"shdocvw.dll");
if (hRShell) if (hFallback)
{ {
PWINLIST_INIT func = (PWINLIST_INIT)GetProcAddress(hRShell, "WinList_Init"); PWINLIST_INIT func = (PWINLIST_INIT) GetProcAddress(hFallback, (LPCSTR) 110);
if (func) if (func)
{ {
return func(); return func();
@ -136,7 +153,12 @@ typedef void (WINAPI *PSHELLDDEINIT)(BOOL bInit);
void WINAPI ShellDDEInit(BOOL bInit) void WINAPI ShellDDEInit(BOOL bInit)
{ {
HINSTANCE hRShell = LoadLibraryW(L"rshell.dll"); HINSTANCE hFallback;
if (!hRShell)
{
hRShell = LoadLibraryW(L"rshell.dll");
}
if (hRShell) if (hRShell)
{ {
@ -148,15 +170,15 @@ void WINAPI ShellDDEInit(BOOL bInit)
} }
} }
hRShell = LoadLibraryW(L"shell32.dll"); hFallback = GetModuleHandleW(L"shell32.dll");
if (hRShell) if (hFallback)
{ {
PSHELLDDEINIT func = (PSHELLDDEINIT)GetProcAddress(hRShell, "ShellDDEInit"); PSHELLDDEINIT func = (PSHELLDDEINIT) GetProcAddress(hFallback, (LPCSTR) 188);
if (func) if (func)
{ {
func(bInit); func(bInit);
return; return;
} }
} }
} }