static void DeleteShellExtensionProgramKey(const CSysString &extension) { NSynchronization::CCriticalSectionLock lock(g_CriticalSection); CKey rootKey; rootKey.Attach(HKEY_CLASSES_ROOT); rootKey.RecurseDeleteKey(GetExtProgramKeyName(extension)); rootKey.Detach(); }
bool CheckShellExtensionInfo(const CSysString &extension, UString &iconPath, int &iconIndex) { NSynchronization::CCriticalSectionLock lock(g_CriticalSection); if (!CheckShellExtensionInfo2(extension, iconPath, iconIndex)) return false; CKey extProgKey; return (extProgKey.Open(HKEY_CLASSES_ROOT, GetExtProgramKeyName(extension), KEY_READ) == ERROR_SUCCESS); }
LONG DeleteShellExtensionInfo(HKEY hkey, const CSysString &ext) { // NSynchronization::CCriticalSectionLock lock(g_CriticalSection); CKey rootKey; rootKey.Attach(hkey); LONG res = rootKey.RecurseDeleteKey(GetExtKeyPath(hkey, ext)); // then we delete only 7-Zip.* key. rootKey.RecurseDeleteKey(GetFullKeyPath(hkey, GetExtProgramKeyName(ext))); rootKey.Detach(); return res; }
void AddShellExtensionInfo(const CSysString &extension, const UString &programTitle, const UString &programOpenCommand, const UString &iconPath, int iconIndex, const void *shellNewData, int shellNewDataSize) { DeleteShellExtensionKey(extension); DeleteShellExtensionProgramKey(extension); NSynchronization::CCriticalSectionLock lock(g_CriticalSection); CSysString programKeyName = GetExtProgramKeyName(extension); { CKey extKey; extKey.Create(HKEY_CLASSES_ROOT, GetExtensionKeyName(extension)); extKey.SetValue(NULL, programKeyName); if (shellNewData != NULL) { CKey shellNewKey; shellNewKey.Create(extKey, kShellNewKeyName); shellNewKey.SetValue(kShellNewDataValueName, shellNewData, shellNewDataSize); } } CKey programKey; programKey.Create(HKEY_CLASSES_ROOT, programKeyName); programKey.SetValue(NULL, programTitle); { CKey iconKey; iconKey.Create(programKey, kDefaultIconKeyName); UString iconPathFull = iconPath; if (iconIndex >= 0) { iconPathFull += L","; wchar_t s[32]; ConvertUInt64ToString((UInt64)iconIndex, s); iconPathFull += s; } iconKey.SetValue(NULL, iconPathFull); } CKey shellKey; shellKey.Create(programKey, kShellKeyName); shellKey.SetValue(NULL, TEXT("")); CKey openKey; openKey.Create(shellKey, kOpenKeyName); openKey.SetValue(NULL, TEXT("")); CKey commandKey; commandKey.Create(openKey, kCommandKeyName); commandKey.SetValue(NULL, programOpenCommand); }
static bool CheckShellExtensionInfo2(const CSysString &extension, UString &iconPath, int &iconIndex) { iconIndex = -1; iconPath.Empty(); NSynchronization::CCriticalSectionLock lock(g_CriticalSection); CKey extKey; if (extKey.Open(HKEY_CLASSES_ROOT, GetExtensionKeyName(extension), KEY_READ) != ERROR_SUCCESS) return false; CSysString programNameValue; if (extKey.QueryValue(NULL, programNameValue) != ERROR_SUCCESS) return false; CSysString extProgramKeyName = GetExtProgramKeyName(extension); UString programNameValueU = GetUnicodeString(programNameValue); if (programNameValueU.CompareNoCase(GetUnicodeString(extProgramKeyName)) != 0) return false; CKey iconKey; if (extKey.Open(HKEY_CLASSES_ROOT, extProgramKeyName + CSysString(TEXT(CHAR_PATH_SEPARATOR)) + kDefaultIconKeyName, KEY_READ) != ERROR_SUCCESS) return false; UString value; if (extKey.QueryValue(NULL, value) == ERROR_SUCCESS) { int pos = value.ReverseFind(L','); iconPath = value; if (pos >= 0) { const wchar_t *end; UInt64 index = ConvertStringToUInt64((const wchar_t *)value + pos + 1, &end); if (*end == 0) { iconIndex = (int)index; iconPath = value.Left(pos); } } } return true; }
LONG AddShellExtensionInfo(HKEY hkey, const CSysString &ext, const UString &programTitle, const UString &programOpenCommand, const UString &iconPath, int iconIndex // , const void *shellNewData, int shellNewDataSize ) { LONG res = 0; DeleteShellExtensionInfo(hkey, ext); // NSynchronization::CCriticalSectionLock lock(g_CriticalSection); CSysString programKeyName; { CSysString ext2 = ext; if (iconIndex < 0) ext2 = TEXT("*"); programKeyName = GetExtProgramKeyName(ext2); } { CKey extKey; res = extKey.Create(hkey, GetExtKeyPath(hkey, ext)); extKey.SetValue(NULL, programKeyName); /* if (shellNewData != NULL) { CKey shellNewKey; shellNewKey.Create(extKey, kShellNewKeyName); shellNewKey.SetValue(kShellNewDataValueName, shellNewData, shellNewDataSize); } */ } CKey programKey; programKey.Create(hkey, GetFullKeyPath(hkey, programKeyName)); programKey.SetValue(NULL, programTitle); { CKey iconKey; UString iconPathFull = iconPath; if (iconIndex < 0) iconIndex = 0; // if (iconIndex >= 0) { iconPathFull += L','; wchar_t s[16]; ConvertUInt32ToString((UInt32)iconIndex, s); iconPathFull += s; } iconKey.Create(programKey, kDefaultIconKeyName); iconKey.SetValue(NULL, iconPathFull); } CKey shellKey; shellKey.Create(programKey, kShellKeyName); shellKey.SetValue(NULL, TEXT("")); CKey openKey; openKey.Create(shellKey, kOpenKeyName); openKey.SetValue(NULL, TEXT("")); CKey commandKey; commandKey.Create(openKey, kCommandKeyName); commandKey.SetValue(NULL, programOpenCommand); return res; }