diff options
author | Jens-Heiner Rechtien <hr@openoffice.org> | 2004-09-08 13:31:31 +0000 |
---|---|---|
committer | Jens-Heiner Rechtien <hr@openoffice.org> | 2004-09-08 13:31:31 +0000 |
commit | dad7f386889bf010b3c90c775175d114acddfcdd (patch) | |
tree | c88f7b48a4120bb1e5757c8c6b70fc810463e60b /shell/source/win32/shlxthandler/shlxthdl.cxx | |
parent | 6d5e7c78477a3b80afd618f1edcf65a07fb53f39 (diff) |
INTEGRATION: CWS desktintgr02 (1.3.8); FILE MERGED
2004/08/13 06:48:59 tra 1.3.8.2: #i24335#added thumbnail registration code and polished the code a little bit, shell extensions will now only be approved when the registration was successful
2004/08/11 11:41:21 tra 1.3.8.1: #i24335#added thumbviewer related code
Diffstat (limited to 'shell/source/win32/shlxthandler/shlxthdl.cxx')
-rw-r--r-- | shell/source/win32/shlxthandler/shlxthdl.cxx | 200 |
1 files changed, 83 insertions, 117 deletions
diff --git a/shell/source/win32/shlxthandler/shlxthdl.cxx b/shell/source/win32/shlxthandler/shlxthdl.cxx index ceabff074258..102534cd1643 100644 --- a/shell/source/win32/shlxthandler/shlxthdl.cxx +++ b/shell/source/win32/shlxthandler/shlxthdl.cxx @@ -2,9 +2,9 @@ * * $RCSfile: shlxthdl.cxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * - * last change: $Author: hr $ $Date: 2004-04-07 11:09:36 $ + * last change: $Author: hr $ $Date: 2004-09-08 14:31:31 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -94,13 +94,8 @@ //--------------------------- // Module global //--------------------------- - long g_DllRefCnt = 0; -//--------------------------- -// -//--------------------------- - namespace /* private */ { const char* GUID_PLACEHOLDER = "{GUID}"; @@ -123,7 +118,6 @@ namespace /* private */ // "String Placeholder" -> // "String Replacement" //--------------------------- - void SubstitutePlaceholder(std::string& String, const std::string& Placeholder, const std::string& Replacement) { std::string::size_type idx = String.find(Placeholder); @@ -136,13 +130,11 @@ namespace /* private */ } } - //---------------------------------------------- - // Make the registry entry - // HKCR\CLSID\{GUID} - // InProcServer32 = Path\shlxthdl.dll - // ThreadingModel = Apartment - //---------------------------------------------- - + /* Make the registry entry + HKCR\CLSID\{GUID} + InProcServer32 = Path\shlxthdl.dll + ThreadingModel = Apartment + */ HRESULT RegisterComComponent(const char* FilePath, const CLSID& Guid) { std::string ClsidEntry = CLSID_ENTRY; @@ -157,10 +149,6 @@ namespace /* private */ return S_OK; } - //--------------------------- - // - //--------------------------- - HRESULT UnregisterComComponent(const CLSID& Guid) { std::string tmp = "CLSID\\"; @@ -168,10 +156,6 @@ namespace /* private */ return DeleteRegistryKey(HKEY_CLASSES_ROOT, tmp.c_str()) ? S_OK : E_FAIL; } - //--------------------------- - // - //--------------------------- - HRESULT RegisterColumnHandler(const char* ModuleFileName) { if (FAILED(RegisterComComponent(ModuleFileName, CLSID_COLUMN_HANDLER))) @@ -187,10 +171,6 @@ namespace /* private */ WStringToString(COLUMN_HANDLER_DESCRIPTIVE_NAME).c_str()) ? S_OK : E_FAIL; } - //--------------------------- - // - //--------------------------- - HRESULT UnregisterColumnHandler() { std::string tmp = "Folder\\shellex\\ColumnHandlers\\"; @@ -202,10 +182,6 @@ namespace /* private */ return UnregisterComComponent(CLSID_COLUMN_HANDLER); } - //--------------------------- - // - //--------------------------- - HRESULT RegisterInfotipHandler(const char* ModuleFileName) { if (FAILED(RegisterComComponent(ModuleFileName, CLSID_INFOTIP_HANDLER))) @@ -217,21 +193,15 @@ namespace /* private */ for(size_t i = 0; i < OOFileExtensionTableSize; i++) { tmp = SHELLEX_IID_ENTRY; - SubstitutePlaceholder(tmp, EXTENSION_PLACEHOLDER, OOFileExtensionTable[i].ExtensionAnsi); SubstitutePlaceholder(tmp, GUID_PLACEHOLDER, iid); if (!SetRegistryKey(HKEY_CLASSES_ROOT, tmp.c_str(), "", ClsidToString(CLSID_INFOTIP_HANDLER).c_str())) return E_FAIL; } - return S_OK; } - //--------------------------- - // - //--------------------------- - HRESULT UnregisterInfotipHandler() { std::string iid = ClsidToString(IID_IQueryInfo); @@ -248,23 +218,16 @@ namespace /* private */ // if there are no further subkey below .ext\\shellex // delete the whole subkey - tmp = SHELLEX_ENTRY; - SubstitutePlaceholder(tmp, EXTENSION_PLACEHOLDER, OOFileExtensionTable[i].ExtensionAnsi); bool HasSubKeys = true; if (HasSubkeysRegistryKey(HKEY_CLASSES_ROOT, tmp.c_str(), HasSubKeys) && !HasSubKeys) DeleteRegistryKey(HKEY_CLASSES_ROOT, tmp.c_str()); } - return UnregisterComComponent(CLSID_INFOTIP_HANDLER); } - //--------------------------- - // - //--------------------------- - HRESULT RegisterPropSheetHandler(const char* ModuleFileName) { std::string ExtEntry; @@ -281,14 +244,9 @@ namespace /* private */ if (!SetRegistryKey(HKEY_CLASSES_ROOT, FwdKeyEntry.c_str(), "", ClsidToString(CLSID_PROPERTYSHEET_HANDLER).c_str())) return E_FAIL; } - return S_OK; } - //--------------------------- - // - //--------------------------- - HRESULT UnregisterPropSheetHandler() { std::string ExtEntry; @@ -319,12 +277,55 @@ namespace /* private */ return UnregisterComComponent(CLSID_PROPERTYSHEET_HANDLER); } - //----------------------------------- - /** Approve the Shell Extension, it's - important for Windows NT/2000/XP - See MSDN: Creating Shell Extension - Handlers - */ + HRESULT RegisterThumbviewerHandler(const char* ModuleFileName) + { + if (FAILED(RegisterComComponent(ModuleFileName, CLSID_THUMBVIEWER_HANDLER))) + return E_FAIL; + + std::string iid = ClsidToString(IID_IExtractImage); + std::string tmp; + + for(size_t i = 0; i < OOFileExtensionTableSize; i++) + { + tmp = SHELLEX_IID_ENTRY; + + SubstitutePlaceholder(tmp, EXTENSION_PLACEHOLDER, OOFileExtensionTable[i].ExtensionAnsi); + SubstitutePlaceholder(tmp, GUID_PLACEHOLDER, iid); + + if (!SetRegistryKey(HKEY_CLASSES_ROOT, tmp.c_str(), "", ClsidToString(CLSID_THUMBVIEWER_HANDLER).c_str())) + return E_FAIL; + } + return S_OK; + } + + HRESULT UnregisterThumbviewerHandler() + { + std::string iid = ClsidToString(IID_IExtractImage); + std::string tmp; + + for (size_t i = 0; i < OOFileExtensionTableSize; i++) + { + tmp = SHELLEX_IID_ENTRY; + + SubstitutePlaceholder(tmp, EXTENSION_PLACEHOLDER, OOFileExtensionTable[i].ExtensionAnsi); + SubstitutePlaceholder(tmp, GUID_PLACEHOLDER, iid); + + DeleteRegistryKey(HKEY_CLASSES_ROOT, tmp.c_str()); + + // if there are no further subkey below .ext\\shellex + // delete the whole subkey + tmp = SHELLEX_ENTRY; + SubstitutePlaceholder(tmp, EXTENSION_PLACEHOLDER, OOFileExtensionTable[i].ExtensionAnsi); + + bool HasSubKeys = true; + if (HasSubkeysRegistryKey(HKEY_CLASSES_ROOT, tmp.c_str(), HasSubKeys) && !HasSubKeys) + DeleteRegistryKey(HKEY_CLASSES_ROOT, tmp.c_str()); + } + return UnregisterComComponent(CLSID_THUMBVIEWER_HANDLER); + } + + /** Approving/Unapproving the Shell Extension, it's important under Windows + NT/2000/XP, see MSDN: Creating Shell Extension Handlers */ HRESULT ApproveShellExtension(CLSID clsid, const std::wstring& Description) { bool bRet = SetRegistryKey( @@ -336,12 +337,6 @@ namespace /* private */ return bRet ? S_OK : E_FAIL; } - //------------------------------------ - /** Unapprove the Shell Extension, it's - important under Windows NT/2000/XP - See MSDN: Creating Shell Extension - Handlers - */ HRESULT UnapproveShellExtension(CLSID Clsid) { HKEY hkey; @@ -366,10 +361,9 @@ namespace /* private */ } // namespace /* private */ -//--------------------------- +//--------------------- // COM exports -//--------------------------- - +//--------------------- extern "C" STDAPI DllRegisterServer() { @@ -380,64 +374,39 @@ extern "C" STDAPI DllRegisterServer() ModuleFileName, sizeof(ModuleFileName)); + std::string module_path = WStringToString(ModuleFileName); HRESULT hr = S_OK; - -// register column handler -#ifdef UNICODE - if (FAILED(RegisterColumnHandler(WStringToString(ModuleFileName).c_str()))) + if (SUCCEEDED(RegisterColumnHandler(module_path.c_str()))) + ApproveShellExtension(CLSID_COLUMN_HANDLER, COLUMN_HANDLER_DESCRIPTIVE_NAME); + else hr = E_FAIL; -#else - if (FAILED(RegisterColumnHandler(ModuleFileName))) - hr = E_FAIL; -#endif - ApproveShellExtension( - CLSID_COLUMN_HANDLER, - COLUMN_HANDLER_DESCRIPTIVE_NAME); - -// register info tip control -#ifdef UNICODE - if (FAILED(RegisterInfotipHandler(WStringToString(ModuleFileName).c_str()))) - hr = E_FAIL; -#else - if (FAILED(RegisterInfotipHandler(ModuleFileName))) + if (SUCCEEDED(RegisterInfotipHandler(module_path.c_str()))) + ApproveShellExtension(CLSID_INFOTIP_HANDLER, INFOTIP_HANDLER_DESCRIPTIVE_NAME); + else hr = E_FAIL; -#endif - ApproveShellExtension( - CLSID_INFOTIP_HANDLER, - INFOTIP_HANDLER_DESCRIPTIVE_NAME); - -// register property sheet handler -#ifdef UNICODE - if (FAILED(RegisterPropSheetHandler(WStringToString(ModuleFileName).c_str()))) - hr = E_FAIL; -#else - if (FAILED(RegisterPropSheetHandler(ModuleFileName))) + if (SUCCEEDED(RegisterPropSheetHandler(module_path.c_str()))) + ApproveShellExtension(CLSID_PROPERTYSHEET_HANDLER, PROPSHEET_HANDLER_DESCRIPTIVE_NAME); + else hr = E_FAIL; -#endif - ApproveShellExtension( - CLSID_PROPERTYSHEET_HANDLER, - PROPSHEET_HANDLER_DESCRIPTIVE_NAME); + if (SUCCEEDED(RegisterThumbviewerHandler(module_path.c_str()))) + ApproveShellExtension(CLSID_THUMBVIEWER_HANDLER, THUMBVIEWER_HANDLER_DESCRIPTIVAE_NAME); + else + hr = E_FAIL; - // notify the Shell that something has - // changed + // notify the Shell that something has changed SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0); return hr; } -//--------------------------- -// -//--------------------------- - extern "C" STDAPI DllUnregisterServer() { HRESULT hr = S_OK; - if (FAILED(UnregisterColumnHandler())) hr = E_FAIL; @@ -448,28 +417,30 @@ extern "C" STDAPI DllUnregisterServer() UnapproveShellExtension(CLSID_INFOTIP_HANDLER); - if (FAILED(UnregisterPropSheetHandler())) hr = E_FAIL; UnapproveShellExtension(CLSID_PROPERTYSHEET_HANDLER); - // notify the Shell that something has - // changed + if (FAILED(UnregisterThumbviewerHandler())) + hr = E_FAIL; + + UnapproveShellExtension(CLSID_THUMBVIEWER_HANDLER); + + // notify the Shell that something has changed SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0); return hr; } -//--------------------------- -// -//--------------------------- - extern "C" STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void** ppv) { *ppv = 0; - if ((rclsid != CLSID_INFOTIP_HANDLER) && (rclsid != CLSID_COLUMN_HANDLER) && (rclsid != CLSID_PROPERTYSHEET_HANDLER)) + if ((rclsid != CLSID_INFOTIP_HANDLER) && + (rclsid != CLSID_COLUMN_HANDLER) && + (rclsid != CLSID_PROPERTYSHEET_HANDLER) && + (rclsid != CLSID_THUMBVIEWER_HANDLER)) return CLASS_E_CLASSNOTAVAILABLE; if ((riid != IID_IUnknown) && (riid != IID_IClassFactory)) @@ -480,14 +451,9 @@ extern "C" STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void** ppv) return E_OUTOFMEMORY; *ppv = pUnk; - return S_OK; } -//--------------------------- -// -//--------------------------- - extern "C" STDAPI DllCanUnloadNow(void) { if (CClassFactory::IsLocked() || g_DllRefCnt > 0) |