// webvw.cpp : Main Web View File // contains implementation of DLL Exports; debug info, etc. #include "priv.h" #include "wvcoord.h" #include "fldricon.h" #define DECL_CRTFREE #include STDAPI RegisterStuff(HINSTANCE hinstWebvw); // from install.cpp HRESULT SetFileAndFolderAttribs(HINSTANCE hInstResource); CComModule _Module; BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_WebView, CComObject) // W2K OBJECT_ENTRY(CLSID_WebViewOld, CComObject) // W2K OBJECT_ENTRY(CLSID_ThumbCtl, CComObject) // W2K OBJECT_ENTRY(CLSID_ThumbCtlOld, CComObject) // W2K OBJECT_ENTRY(CLSID_WebViewFolderIcon, CComObject) // W2K OBJECT_ENTRY(CLSID_WebViewFolderIconOld, CComObject) // W2K END_OBJECT_MAP() ///////////////////////////////////////////////////////////////////////////// // DLL Entry Point STDAPI_(BOOL) DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/) { if (dwReason == DLL_PROCESS_ATTACH) { #ifdef DEBUG CcshellGetDebugFlags(); #endif _Module.Init(ObjectMap, hInstance); DisableThreadLibraryCalls(hInstance); SHFusionInitializeFromModule(hInstance); } else if (dwReason == DLL_PROCESS_DETACH) { SHFusionUninitialize(); _Module.Term(); } return TRUE; // ok } ///////////////////////////////////////////////////////////////////////////// // Used to determine whether the DLL can be unloaded by OLE STDAPI DllCanUnloadNow(void) { return (_Module.GetLockCount()==0) ? S_OK : S_FALSE; } ///////////////////////////////////////////////////////////////////////////// // Returns a class factory to create an object of the requested type STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { return _Module.GetClassObject(rclsid, riid, ppv); } typedef int (* PFNLOADSTRING) (HINSTANCE, UINT, LPTSTR, int); // This is used so we aren't forced to call MLLoadString int NonMLLoadString(HINSTANCE hinst, UINT uID, LPTSTR psz, int cch) { static PFNLOADSTRING s_pfn = (PFNLOADSTRING)-1; if (s_pfn == (PFNLOADSTRING)-1) { s_pfn = (PFNLOADSTRING) GetProcAddress(GetModuleHandle(TEXT("USER32.DLL")), "LoadStringW"); } if (s_pfn) { return s_pfn(hinst, uID, psz, cch); } return 0; } HRESULT ConvertDefaultWallpaper(void) { HRESULT hr; if (!IsOS(OS_WOW6432)) { hr = E_OUTOFMEMORY; // We convert the default wallpaper (default.jpg) to a .bmp since user can't handle .jpg's and // we don't want to force Active Desktop on. TCHAR szPathSrc[MAX_PATH]; TCHAR szPathDest[MAX_PATH]; if (GetWindowsDirectory(szPathSrc, ARRAYSIZE(szPathSrc))) { int cchCopied; TCHAR szDisplayName[MAX_PATH]; UINT uID; // we have different default wallpaper files for per vs. pro vs. server if (IsOS(OS_ANYSERVER)) { uID = IDS_WALLPAPER_LOCNAME_SRV; } else if (IsOS(OS_PERSONAL)) { uID = IDS_WALLPAPER_LOCNAME_PER; } else { // use the professional wallpaper uID = IDS_WALLPAPER_LOCNAME; } // we want to call the non-MUI loadstring function here since the wallpaper is a file on disk that is always localized // in the system default local, not whatever the current users local is cchCopied = NonMLLoadString(_Module.GetResourceInstance(), uID, szDisplayName, ARRAYSIZE(szDisplayName)); if (cchCopied) { PathAppend(szPathSrc, TEXT("Web\\Wallpaper\\")); StrCpyN(szPathDest, szPathSrc, ARRAYSIZE(szPathDest)); PathAppend(szPathSrc, TEXT("default.jpg")); PathAppend(szPathDest, szDisplayName); StrCatBuff(szPathDest, TEXT(".bmp"), ARRAYSIZE(szPathDest)); if (PathFileExists(szPathSrc)) { hr = SHConvertGraphicsFile(szPathSrc, szPathDest, SHCGF_REPLACEFILE); if (SUCCEEDED(hr)) { DeleteFile(szPathSrc); } } else { hr = S_OK; } } } } else { // don't try to convert the wallpaper if we are wow6432 since the 64 bit guy already // did it for us and if we try it will end up deleting it!! hr = S_OK; } return hr; } ///////////////////////////////////////////////////////////////////////////// // DllRegisterServer - Adds entries to the system registry STDAPI DllRegisterServer(void) { // setup attribs on system files/folders HRESULT hrRet = SetFileAndFolderAttribs(_Module.GetResourceInstance()); TCHAR szWinPath[MAX_PATH]; GetWindowsDirectory(szWinPath, ARRAYSIZE(szWinPath)); struct _ATL_REGMAP_ENTRY regMap[] = { {OLESTR("windir"), szWinPath}, // subsitute %windir% for registry {0, 0} }; HRESULT hr = RegisterStuff(_Module.GetResourceInstance()); if (SUCCEEDED(hrRet)) { hrRet = hr; } ConvertDefaultWallpaper(); // registers object, typelib and all interfaces in typelib hr = _Module.RegisterServer(TRUE); return SUCCEEDED(hrRet) ? hr : hrRet; } STDAPI DllInstall(BOOL fInstall, LPCWSTR pszCmdLine) { HRESULT hr = E_FAIL; if (pszCmdLine) { ASSERTMSG(StrStrIW(pszCmdLine, L"/RES=") == NULL, "webvw!DllInstall : passed old MUI command (no longer supported)"); } return hr; } ///////////////////////////////////////////////////////////////////////////// // DllUnregisterServer - Removes entries from the system registry STDAPI DllUnregisterServer(void) { _Module.UnregisterServer(); return S_OK; }