Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно сохранить ключ реестра, А если по точнее как работать со string 
:(
    Опции темы
compaq
Дата 21.7.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



Всем доброго времени суток.
Вопрос такой. Почему при попытке сохранить значение ключа реестра в 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);

        }

PM MAIL   Вверх
Partizan
Дата 21.7.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



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


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
compaq
Дата 21.7.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



Точно  smile  это я просто не доглядел  smile  Спасибо. А вообще конечно имхо извратный они способ доступа сделали, что нельзя было сделать прямой линк образно выражаясь. Вместо этого дуратского спуска по иерархической лестнице.
PM MAIL   Вверх
Levon11
Дата 21.7.2008, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 5.8.2007

Репутация: нет
Всего: нет



Это у них политика такая, минимизируют наши сношения с реестром.  smile 
PM MAIL   Вверх
compaq
Дата 21.7.2008, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



Люди а вот теперь у меня более интересный вопрос возник. Ситуация такая, мне нужно прочитать название под ключей я это делаю с помошью функции 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


Не кто не знает как рещить такую проблему?
PM MAIL   Вверх
Levon11
Дата 22.7.2008, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 5.8.2007

Репутация: нет
Всего: нет



Не очень понятны твои комментарии, но думаю нужно сделать так 

Код

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

 smile 

А то ты тут
Код

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

Это сообщение отредактировал(а) Levon11 - 22.7.2008, 17:28
PM MAIL   Вверх
compaq
Дата 22.7.2008, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



Как оптимизировать данный код
Собственно задача сводится к этому 
Вот код функции, которую я написал, но меня очень смущает, что для доступа к значению из шага 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");
        }

PM MAIL   Вверх
Bishop
Дата 23.7.2008, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 3.6.2005
Где: Минск, Беларусь

Репутация: 6
Всего: 16



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;
}

PM WWW ICQ   Вверх
compaq
Дата 23.7.2008, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



Bishop
Большое спасибо, я даже как то про регулярные выражения и не подумал.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0749 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.