Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Как правильно сохранить ключ реестра


Автор: compaq 21.7.2008, 11:00
Всем доброго времени суток.
Вопрос такой. Почему при попытке сохранить значение ключа реестра в string, значение сохраняется не в шестнадцатеричное представлении  ({eec97550-47a9-11cf-b952-00aa0051fe20}) а в строковом ("htmlfile") и как это можно исправить.
Код


        private void button1_Click(object sender, EventArgs e)
        {
            string extension = ".htm"; 
            RegistryKey softwareKey = Registry.LocalMachine.OpenSubKey("Software"); 
            RegistryKey classesKey = softwareKey.OpenSubKey("Classes");
            RegistryKey CLSIDKey = classesKey.OpenSubKey("CLSID");
            RegistryKey extensionKey = classesKey.OpenSubKey(extension); //спустился до нужного мне значения

            string PersistentHandler = extensionKey.GetValue("").ToString(); //считываю значение и в место {eec97550-47a9-11cf-b952-00aa0051fe20} получаю "htmlfile"

            RegistryKey PersistentHandlerKey = CLSIDKey.OpenSubKey(PersistentHandler);

        }

Автор: Partizan 21.7.2008, 12:18
compaq, мне думается что ключ просто не тот считываете вы....ибо первое значение - это guid, и никак не 16-чное представление строки htmlfile

Автор: compaq 21.7.2008, 14:12
Точно  smile  это я просто не доглядел  smile  Спасибо. А вообще конечно имхо извратный они способ доступа сделали, что нельзя было сделать прямой линк образно выражаясь. Вместо этого дуратского спуска по иерархической лестнице.

Автор: Levon11 21.7.2008, 14:25
Это у них политика такая, минимизируют наши сношения с реестром.  smile 

Автор: compaq 21.7.2008, 18:52
Люди а вот теперь у меня более интересный вопрос возник. Ситуация такая, мне нужно прочитать название под ключей я это делаю с помошью функции GetSubKeyNames(); всё бы хорошо но она возврящяет значение в виде строкового массива и это значение я уже не могу применить в качестве имени ключа. А мне как раз это и надо сделать
Код

            string extension = ".htm";
            RegistryKey softwareKey = Registry.LocalMachine.OpenSubKey("Software");
            RegistryKey classesKey = softwareKey.OpenSubKey("Classes");
            RegistryKey CLSIDKey = classesKey.OpenSubKey("CLSID");
            RegistryKey extensionKey = classesKey.OpenSubKey(extension);
            RegistryKey PersistentHandlerKey = extensionKey.OpenSubKey("PersistentHandler");
            string PersistentHandler = PersistentHandlerKey.GetValue("").ToString();
            RegistryKey PersistentAddinsRegisteredKey = CLSIDKey.OpenSubKey(PersistentHandler);
            RegistryKey Pers = PersistentAddinsRegisteredKey.OpenSubKey("PersistentAddinsRegistered");// спустился на нужный уровень получил значение 


            string[] GUID = Pers.GetSubKeyNames();// получаю имена вложенных ключей
            string x = GUID[0] ;// беру имя нужного мне ключа 

            string r = x.GetValue("").ToString();// и тут получаю ошибку связанную с неправильным типом так как х у меня строка а нужно что бы он был Microsoft.Win32.RegistryKey


Не кто не знает как рещить такую проблему?

Автор: Levon11 22.7.2008, 17:25
Не очень понятны твои комментарии, но думаю нужно сделать так 

Код

RegistryKey rk = Pers.OpenSubKey(x);
string r = rk.GetValue("").ToString();

 smile 

А то ты тут
Код

string r = x.GetValue("").ToString();
 
применяешь метод к объекту string, а нужно к объекту типа RegistryKey. smile 

Автор: compaq 22.7.2008, 22:55
Как оптимизировать данный код
Собственно задача сводится к http://msdn.microsoft.com/en-us/library/ms692488(VS.85).aspx
Вот код функции, которую я написал, но меня очень смущает, что для доступа к значению из шага 3 приходится прибегать к такому изврату (Persis = Persis + "\\" + GuidValue;)
Может можно как то поопрятней сделать.

Код

public string FindingDLL(string extension)
        {
            RegistryKey SoftwareClassesKey = Registry.LocalMachine.OpenSubKey("Software\\Classes");
            RegistryKey ExtensionKey = SoftwareClassesKey.OpenSubKey(extension);
            RegistryKey PersistentHandlerKey = ExtensionKey.OpenSubKey("PersistentHandler");
            RegistryKey SoftwareClassesClsidKey = Registry.LocalMachine.OpenSubKey("Software\\Classes\\CLSID");
            string PersistentHandlerValue = PersistentHandlerKey.GetValue("").ToString();
            RegistryKey GuidKey = SoftwareClassesClsidKey.OpenSubKey(PersistentHandlerValue);
            RegistryKey PersistentAddinsRegisteredKey = GuidKey.OpenSubKey("PersistentAddinsRegistered");
            string Persis = PersistentAddinsRegisteredKey.ToString();
            string[] GUID = PersistentAddinsRegisteredKey.GetSubKeyNames();
            string GuidValue = GUID[0];
            Persis = Persis + "\\" + GuidValue;//!!!!!!!!!!!!!!!!!!!!!!!!!!!
            string a = Persis.Substring(19);
            RegistryKey SofKey = Registry.LocalMachine.OpenSubKey(a);
            string Per = SofKey.GetValue("").ToString();
            RegistryKey SoKey = SoftwareClassesClsidKey.OpenSubKey(Per);
            RegistryKey SosKey = SoKey.OpenSubKey("InprocServer32");
            string Value = SosKey.GetValue("").ToString();
            return Value;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            FindingDLL(".htm");
        }

Автор: Bishop 23.7.2008, 00:21
compaq, я бы делал как-то так:
Код

public string[] FindingDLL(string extension)
{
    string pClasses = Registry.LocalMachine.Name + @"\Software\Classes\";
    string pHandler = pClasses + @"{0}\PersistentHandler";

    string HandlerValue = Registry.GetValue(string.Format(pHandler, extension), "", "") as string;

    string pAddins = string.Format(@"Software\Classes\CLSID\{0}\PersistentAddinsRegistered", HandlerValue);
    string Value = "";
    foreach (string GuidValue in Registry.LocalMachine.OpenSubKey(pAddins).GetSubKeyNames())
    {
        string pAddin = Registry.GetValue(
            string.Join("\\",
                new string[] {
                    Registry.LocalMachine.Name, 
                    pAddins,
                    GuidValue
                }
            ),
            "", "") as string;
        Value += Registry.GetValue(string.Format(@"{0}CLSID\{1}\InprocServer32", pClasses, pAddin), "", "") as string + "|";
    }
    return Value.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
}


В твоём же коде "Persis" вообще не нужен:
Код

public string FindingDLL(string extension)
{
    RegistryKey SoftwareClassesKey = Registry.LocalMachine.OpenSubKey("Software\\Classes");
    RegistryKey ExtensionKey = SoftwareClassesKey.OpenSubKey(extension);
    RegistryKey PersistentHandlerKey = ExtensionKey.OpenSubKey("PersistentHandler");
    RegistryKey SoftwareClassesClsidKey = Registry.LocalMachine.OpenSubKey("Software\\Classes\\CLSID");
    string PersistentHandlerValue = PersistentHandlerKey.GetValue("").ToString();
    RegistryKey GuidKey = SoftwareClassesClsidKey.OpenSubKey(PersistentHandlerValue);
    RegistryKey PersistentAddinsRegisteredKey = GuidKey.OpenSubKey("PersistentAddinsRegistered");
    //string Persis = PersistentAddinsRegisteredKey.ToString();
    string[] GUID = PersistentAddinsRegisteredKey.GetSubKeyNames();
    string GuidValue = GUID[0];
    //Persis = Persis + "\\" + GuidValue;//!!!!!!!!!!!!!!!!!!!!!!!!!!!
    //string a = Persis.Substring(19);
    //RegistryKey SofKey = Registry.LocalMachine.OpenSubKey(a);
    RegistryKey SofKey = PersistentAddinsRegisteredKey.OpenSubKey(GuidValue); // !!!!!!!!!!!!!
    string Per = SofKey.GetValue("").ToString();
    RegistryKey SoKey = SoftwareClassesClsidKey.OpenSubKey(Per);
    RegistryKey SosKey = SoKey.OpenSubKey("InprocServer32");
    string Value = SosKey.GetValue("").ToString();
    return Value;
}

Автор: compaq 23.7.2008, 10:05
Bishop
Большое спасибо, я даже как то про регулярные выражения и не подумал.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)