diff --git a/dlls/explorerframe/Makefile.in b/dlls/explorerframe/Makefile.in index dad33b16d19..3d17fcda91c 100644 --- a/dlls/explorerframe/Makefile.in +++ b/dlls/explorerframe/Makefile.in @@ -11,6 +11,7 @@ C_SRCS = \ nstc.c RC_SRCS = \ + eframe.rc \ version.rc @MAKE_DLL_RULES@ diff --git a/dlls/explorerframe/eframe.rc b/dlls/explorerframe/eframe.rc new file mode 100644 index 00000000000..25619de0a23 --- /dev/null +++ b/dlls/explorerframe/eframe.rc @@ -0,0 +1,22 @@ +/* + * ExplorerFrame main resource file + * + * Copyright 2010 David Hedberg + * + * 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 St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* @makedep: explorerframe.inf */ +REGINST REGINST explorerframe.inf diff --git a/dlls/explorerframe/explorerframe.inf b/dlls/explorerframe/explorerframe.inf new file mode 100644 index 00000000000..7d6ba635886 --- /dev/null +++ b/dlls/explorerframe/explorerframe.inf @@ -0,0 +1,17 @@ +[version] +Signature="$CHICAGO$" + +[RegisterDll] +AddReg=Classes.Reg + +[UnregisterDll] +DelReg=Classes.Reg + +[Classes.Reg] +; For some reason called "ListView" in the registry. +HKCR,"CLSID\%CLSID_NamespaceTreeControl%",,,"Shell Name Space ListView" +HKCR,"CLSID\%CLSID_NamespaceTreeControl%\InProcServer32",,,"%MODULE%" +HKCR,"CLSID\%CLSID_NamespaceTreeControl%\InProcServer32","ThreadingModel",,"Apartment" + +[Strings] +MODULE="explorerframe.dll" diff --git a/dlls/explorerframe/explorerframe.spec b/dlls/explorerframe/explorerframe.spec index 9ef268427c2..0e644a33870 100644 --- a/dlls/explorerframe/explorerframe.spec +++ b/dlls/explorerframe/explorerframe.spec @@ -5,3 +5,5 @@ @ stdcall -private DllCanUnloadNow() @ stdcall -private DllGetClassObject(ptr ptr ptr) @ stdcall -private DllGetVersion(ptr) +@ stdcall -private DllRegisterServer() +@ stdcall -private DllUnregisterServer() diff --git a/dlls/explorerframe/explorerframe_main.c b/dlls/explorerframe/explorerframe_main.c index fd958ef6f0a..dd3c0cf0162 100644 --- a/dlls/explorerframe/explorerframe_main.c +++ b/dlls/explorerframe/explorerframe_main.c @@ -19,6 +19,7 @@ */ #include +#include #define COBJMACROS #define NONAMELESSUNION @@ -26,8 +27,11 @@ #include "windef.h" #include "winbase.h" +#include "winuser.h" #include "winreg.h" #include "shlwapi.h" +#include "advpub.h" +#include "shobjidl.h" #include "wine/debug.h" @@ -203,3 +207,80 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv) return CLASS_E_CLASSNOTAVAILABLE; } + +/************************************************************************* + * Register/Unregister DLL, based on shdocvw/factory.c + */ +static HRESULT reg_install(LPCSTR section, STRTABLEA *strtable) +{ + HRESULT (WINAPI *pRegInstall)(HMODULE hm, LPCSTR pszSection, const STRTABLEA* pstTable); + HMODULE hadvpack; + HRESULT hres; + + static const WCHAR advpackW[] = {'a','d','v','p','a','c','k','.','d','l','l',0}; + + hadvpack = LoadLibraryW(advpackW); + pRegInstall = (void *)GetProcAddress(hadvpack, "RegInstall"); + + hres = pRegInstall(explorerframe_hinstance, section, strtable); + + FreeLibrary(hadvpack); + return hres; +} + +#define INF_SET_CLSID(clsid) \ + do \ + { \ + static CHAR name[] = "CLSID_" #clsid; \ + \ + pse[i].pszName = name; \ + clsids[i++] = &CLSID_ ## clsid; \ + } while (0) + +static HRESULT register_server(BOOL doregister) +{ + STRTABLEA strtable; + STRENTRYA pse[1]; + static CLSID const *clsids[1]; + unsigned int i = 0; + HRESULT hres; + + INF_SET_CLSID(NamespaceTreeControl); + + for(i = 0; i < sizeof(pse)/sizeof(pse[0]); i++) + { + pse[i].pszValue = HeapAlloc(GetProcessHeap(), 0, 39); + sprintf(pse[i].pszValue, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + clsids[i]->Data1, clsids[i]->Data2, clsids[i]->Data3, clsids[i]->Data4[0], + clsids[i]->Data4[1], clsids[i]->Data4[2], clsids[i]->Data4[3], clsids[i]->Data4[4], + clsids[i]->Data4[5], clsids[i]->Data4[6], clsids[i]->Data4[7]); + } + + strtable.cEntries = sizeof(pse)/sizeof(pse[0]); + strtable.pse = pse; + + hres = reg_install(doregister ? "RegisterDll" : "UnregisterDll", &strtable); + + for(i=0; i < sizeof(pse)/sizeof(pse[0]); i++) + HeapFree(GetProcessHeap(), 0, pse[i].pszValue); + + return hres; +} + +#undef INF_SET_CLSID + +/************************************************************************* + * DllRegisterServer (ExplorerFrame.@) + */ +HRESULT WINAPI DllRegisterServer(void) +{ + return register_server(TRUE); +} + +/************************************************************************* + * DllUnregisterServer (ExplorerFrame.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + return register_server(FALSE); +} diff --git a/tools/wine.inf.in b/tools/wine.inf.in index aa7b4f07cbb..ff5c7b20137 100644 --- a/tools/wine.inf.in +++ b/tools/wine.inf.in @@ -2507,6 +2507,7 @@ HKLM,%CurrentVersion%\Telephony\Country List\998,"SameAreaRule",,"G" 11,,dsound.dll,1 11,,dswave.dll,1 11,,dxdiagn.dll,1 +11,,explorerframe.dll,1 11,,gameux.dll,1 11,,hhctrl.ocx,1 11,,hlink.dll,1