1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
|
// RegistryAssociations.cpp
#include "StdAfx.h"
#include "../../../Common/IntToString.h"
#include "../../../Common/StringConvert.h"
#include "../../../Common/StringToInt.h"
#include "../../../Windows/Registry.h"
#include "RegistryAssociations.h"
using namespace NWindows;
using namespace NRegistry;
namespace NRegistryAssoc {
// static NSynchronization::CCriticalSection g_CriticalSection;
static const TCHAR * const kClasses = TEXT("Software\\Classes\\");
// static const TCHAR * const kShellNewKeyName = TEXT("ShellNew");
// static const TCHAR * const kShellNewDataValueName = TEXT("Data");
static const TCHAR * const kDefaultIconKeyName = TEXT("DefaultIcon");
static const TCHAR * const kShellKeyName = TEXT("shell");
static const TCHAR * const kOpenKeyName = TEXT("open");
static const TCHAR * const kCommandKeyName = TEXT("command");
static const char * const k7zipPrefix = "7-Zip.";
static CSysString GetExtProgramKeyName(const CSysString &ext)
{
return CSysString(k7zipPrefix) + ext;
}
static CSysString GetFullKeyPath(HKEY hkey, const CSysString &name)
{
CSysString s;
if (hkey != HKEY_CLASSES_ROOT)
s = kClasses;
return s + name;
}
static CSysString GetExtKeyPath(HKEY hkey, const CSysString &ext)
{
return GetFullKeyPath(hkey, (TEXT(".")) + ext);
}
bool CShellExtInfo::ReadFromRegistry(HKEY hkey, const CSysString &ext)
{
ProgramKey.Empty();
IconPath.Empty();
IconIndex = -1;
// NSynchronization::CCriticalSectionLock lock(g_CriticalSection);
{
CKey extKey;
if (extKey.Open(hkey, GetExtKeyPath(hkey, ext), KEY_READ) != ERROR_SUCCESS)
return false;
if (extKey.QueryValue(NULL, ProgramKey) != ERROR_SUCCESS)
return false;
}
{
CKey iconKey;
if (iconKey.Open(hkey, GetFullKeyPath(hkey, ProgramKey + CSysString(CHAR_PATH_SEPARATOR) + kDefaultIconKeyName), KEY_READ) == ERROR_SUCCESS)
{
UString value;
if (iconKey.QueryValue(NULL, value) == ERROR_SUCCESS)
{
const int pos = value.ReverseFind(L',');
IconPath = value;
if (pos >= 0)
{
const wchar_t *end;
const Int32 index = ConvertStringToInt32((const wchar_t *)value + pos + 1, &end);
if (*end == 0)
{
// 9.31: if there is no icon index, we use -1. Is it OK?
if (pos != (int)value.Len() - 1)
IconIndex = (int)index;
IconPath.SetFrom(value, (unsigned)pos);
}
}
}
}
}
return true;
}
bool CShellExtInfo::IsIt7Zip() const
{
return ProgramKey.IsPrefixedBy_Ascii_NoCase(k7zipPrefix);
}
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;
}
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 = "*";
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.Add_Char(',');
iconPathFull.Add_UInt32((UInt32)iconIndex);
}
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;
}
}
|