1 // RegistryContextMenu.cpp
\r
5 #include "Windows/Registry.h"
\r
6 #include "Windows/Synchronization.h"
\r
8 #include "RegistryContextMenu.h"
\r
10 using namespace NWindows;
\r
11 using namespace NRegistry;
\r
13 namespace NZipRootRegistry {
\r
17 static NSynchronization::CCriticalSection g_CS;
\r
19 static const TCHAR *kContextMenuKeyName = TEXT("\\shellex\\ContextMenuHandlers\\7-Zip");
\r
20 static const TCHAR *kDragDropMenuKeyName = TEXT("\\shellex\\DragDropHandlers\\7-Zip");
\r
22 static const TCHAR *kExtensionCLSID = TEXT("{23170F69-40C1-278A-1000-000100020000}");
\r
24 static const TCHAR *kRootKeyNameForFile = TEXT("*");
\r
25 static const TCHAR *kRootKeyNameForFolder = TEXT("Folder");
\r
26 static const TCHAR *kRootKeyNameForDirectory = TEXT("Directory");
\r
27 static const TCHAR *kRootKeyNameForDrive = TEXT("Drive");
\r
29 static CSysString GetFullContextMenuKeyName(const CSysString &keyName)
\r
30 { return (keyName + kContextMenuKeyName); }
\r
32 static CSysString GetFullDragDropMenuKeyName(const CSysString &keyName)
\r
33 { return (keyName + kDragDropMenuKeyName); }
\r
35 static bool CheckHandlerCommon(const CSysString &keyName)
\r
37 NSynchronization::CCriticalSectionLock lock(g_CS);
\r
39 if (key.Open(HKEY_CLASSES_ROOT, keyName, KEY_READ) != ERROR_SUCCESS)
\r
42 if (key.QueryValue(NULL, value) != ERROR_SUCCESS)
\r
45 return (value.Compare(kExtensionCLSID) == 0);
\r
48 bool CheckContextMenuHandler()
\r
51 // CheckHandlerCommon(GetFullContextMenuKeyName(kRootKeyNameForFolder)) &&
\r
52 CheckHandlerCommon(GetFullContextMenuKeyName(kRootKeyNameForDirectory)) &&
\r
53 CheckHandlerCommon(GetFullContextMenuKeyName(kRootKeyNameForFile)) &&
\r
54 CheckHandlerCommon(GetFullDragDropMenuKeyName(kRootKeyNameForDirectory)) &&
\r
55 CheckHandlerCommon(GetFullDragDropMenuKeyName(kRootKeyNameForDrive));
\r
58 static void DeleteContextMenuHandlerCommon(const CSysString &keyName)
\r
61 rootKey.Attach(HKEY_CLASSES_ROOT);
\r
62 rootKey.RecurseDeleteKey(GetFullContextMenuKeyName(keyName));
\r
66 static void DeleteDragDropMenuHandlerCommon(const CSysString &keyName)
\r
69 rootKey.Attach(HKEY_CLASSES_ROOT);
\r
70 rootKey.RecurseDeleteKey(GetFullDragDropMenuKeyName(keyName));
\r
74 void DeleteContextMenuHandler()
\r
76 DeleteContextMenuHandlerCommon(kRootKeyNameForFile);
\r
77 DeleteContextMenuHandlerCommon(kRootKeyNameForFolder);
\r
78 DeleteContextMenuHandlerCommon(kRootKeyNameForDirectory);
\r
79 DeleteContextMenuHandlerCommon(kRootKeyNameForDrive);
\r
80 DeleteDragDropMenuHandlerCommon(kRootKeyNameForFile);
\r
81 DeleteDragDropMenuHandlerCommon(kRootKeyNameForFolder);
\r
82 DeleteDragDropMenuHandlerCommon(kRootKeyNameForDirectory);
\r
83 DeleteDragDropMenuHandlerCommon(kRootKeyNameForDrive);
\r
86 static void AddContextMenuHandlerCommon(const CSysString &keyName)
\r
88 DeleteContextMenuHandlerCommon(keyName);
\r
89 NSynchronization::CCriticalSectionLock lock(g_CS);
\r
91 key.Create(HKEY_CLASSES_ROOT, GetFullContextMenuKeyName(keyName));
\r
92 key.SetValue(NULL, kExtensionCLSID);
\r
95 static void AddDragDropMenuHandlerCommon(const CSysString &keyName)
\r
97 DeleteDragDropMenuHandlerCommon(keyName);
\r
98 NSynchronization::CCriticalSectionLock lock(g_CS);
\r
100 key.Create(HKEY_CLASSES_ROOT, GetFullDragDropMenuKeyName(keyName));
\r
101 key.SetValue(NULL, kExtensionCLSID);
\r
104 void AddContextMenuHandler()
\r
106 AddContextMenuHandlerCommon(kRootKeyNameForFile);
\r
107 // AddContextMenuHandlerCommon(kRootKeyNameForFolder);
\r
108 AddContextMenuHandlerCommon(kRootKeyNameForDirectory);
\r
110 AddDragDropMenuHandlerCommon(kRootKeyNameForDirectory);
\r
111 AddDragDropMenuHandlerCommon(kRootKeyNameForDrive);
\r