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


Автор: Hidrag 29.9.2005, 19:38
Проблема такая нужно считать в переменную данные из реестра (двоичный параметр) привести эту переменную к типу string, показать, изменить и записать новые данные.

Вроде бы ничего сложного считывать и записывать данные, а тормознуло меня то, в переменную какого типа считывать данные когда они в двоичном формате ....знаний не хватает.

Код

         private int k;
         ...

         // так мы считываем выводим изменяем и записываем числовые данные
    RegistryKey regKey = Registry.LocalMachine;
    regKey.OpenSubKey("\\SYSTEM\\dddd\\uuuu");
    k=(int)regKey.GetValue("zzzz",k);
    string s;
    s=System.String.Format("{0}",k);
    textBox2.Text=s;
    k=k+20;
    regKey.SetValue("zzzz",k);
        // а как то же самое провернуть с бинарным форматом....

Автор: nikf 29.9.2005, 20:02
byte[]

Автор: Hidrag 30.9.2005, 14:49
Не поддается реестр никак smile
В чем тут моя ошибка?
Код

          try
          {
            RegistryKey regKey = Registry.LocalMachine;
            regKey=regKey.CreateSubKey("\\SYSTEM\\CurrentControlSet\\Control");
          }
          catch(Exception e)
          {
            MessageBox.Show(e.Message,"Ошибка!");
          }



В документации сказано что метод CreateSubKey позволяет создать новый подпараметр или открыть существующий что я и пытаюсь сделать а у меня вылазит ошибка "Уазан недопустимый путь" ...почему недопустимый?

Автор: nikf 30.9.2005, 15:12
"SYSTEM\\CurrentControlSet\\Control" - а так допустимый?

Автор: Hidrag 30.9.2005, 15:19
А почему нет? в примере из книги так написанно, то есть через две касые черты, если пичать через одну SYSTEM\CurrentControlSet\Control компилятор ошибку выдает...

Автор: Artiom 30.9.2005, 15:32
Писать через 2 черты или с @
Две косые черты перед SYSTEM - лишние
пиши так
Цитата(nikf @ 30.9.2005, 14:12)
"SYSTEM\\CurrentControlSet\\Control"


или так
Код

string path = @"SYSTEM\CurrentControlSet\Control";
RegistryKey regKey = Registry.LocalMachine;    
regKey=regKey.CreateSubKey(path);

Автор: Hidrag 30.9.2005, 15:51
Огромное спасибо!!! smile

Заработало! smile Ошибка то глупая ))))

Автор: Hidrag 8.10.2005, 16:11
С одним разобрался с другим так и не получается...
Подскажите как программно записать в реестр?

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Prefetcher
"LastDiskLayoutTime"=hex:30,cb,3d,2b,34,ed,c0,01


HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Dfrg\BootOptimizeFunction
"FileTimeStamp"=hex(b):30,cb,3d,2b,34,ed,c0,01



Автор: Hidrag 14.10.2005, 14:18
Как считать и записать двоичный параметр hex? Нужно срочно! Помогите, кто знает...

Автор: mr.DUDA 14.10.2005, 18:50
Цитата(Hidrag @ 14.10.2005, 14:18)
Как считать и записать двоичный параметр hex? Нужно срочно! Помогите, кто знает...

Ведь сказали уже: читать в массив byte[].

Автор: Hidrag 18.10.2005, 08:52
А пример можно? Понимаю достал, просто нужно а не получается, если считываю в массив тог там одни нули...

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Dfrg\BootOptimizeFunction
"FileTimeStamp"=hex(b):30,cb,3d,2b,34,ed,c0,01

получается нужно создать массив из 8 лементов
Код

private byte[] num= new byte[8];


считываю так:

Код

num[]=(byte[])regKey.GetValue("FileTimeStamp",num[]);


что не так?

Автор: Wanderer2019 18.10.2005, 09:50
вообщем не уверен поможет ли... но попробуй...
Код

static public object getKey(string name,string dir){
            RegistryKey regKey=null;
            Object result=null;
            try
            {
                regKey=Registry.LocalMachine.OpenSubKey(dir,true);//ключ должен находиться в HKEY_LOCAL_MACHINE. т.е. если прямо тут то ставишь просто ""
                result=regKey.GetValue(name);
            }
            catch(Exception e)
            {
                if(regKey==null) result=null;
                else MessageBox.Show("Application "+e.Source+" got an error"+e.StackTrace+". The error is: "+e.Message);                
            }
            finally
            {
                if(regKey!=null)
                    regKey.Close();
            }
            return result;
        }



используем:
Код

object myKey=getKey("test","");
byte[] myBytes=(byte[])myKey;

Автор: Hidrag 26.10.2005, 12:04
Так, ладно... тогда как записать в реестр эти значения?

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Prefetcher
"LastDiskLayoutTime"=hex(b):30,cb,3d,2b,34,ed,c0,01

нужна конкретная реализация... инфу уже обыскался перепробывал по всякому, не получается...

записать то так:
Код

RegistryKey key = Registry.LocalMachine;
string path3=@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Prefetcher";
key=key.CreateSubKey(path3);
key.SetValue("LastDiskLayoutTime"," /* А вот что писать тут???? */");

Автор: mr.DUDA 26.10.2005, 17:26
Вот это работает:
Код
using System;
using System.Security.Permissions;
using Microsoft.Win32;

[assembly: RegistryPermissionAttribute(SecurityAction.RequestMinimum,
All = "HKEY_LOCAL_MACHINE")]

namespace ConsoleApplication1
{
    class Class1
    {
        static void Main()
        {
            RegistryKey key = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Мой раздел реестра");
            key.SetValue("bla-bla-bla", new byte[] {1,2,3,4});
        }
    }
}

Автор: Hidrag 26.10.2005, 20:19
Работает!!! Большое спасибо! smile И откуда только вы все это знаете, mr.DUDA?!

А в чем разница???
Почему работает это?
Код

RegistryKey key = Registry.LocalMachine.СreateSubKey(@"SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Prefetcher");
key.SetValue("LastDiskLayoutTime",new byte[] {48,203,61,43,52,237,192,01});


но не работает это?
Код

RegistryKey key = Registry.LocalMachine;    
string path=@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Prefetcher";    
key=key.CreateSubKey(path);    
key.SetValue("LastDiskLayoutTime",new byte[] {48,203,61,43,52,237,192,01});


Проблема решена полностью, просто интересно, хочется разобраться, не оставляя белых пятен.

И (сейчас наверное в глаз получу) что делает эта строка?
Код

[assembly: RegistryPermissionAttribute(SecurityAction.RequestMinimum,    
All = "HKEY_LOCAL_MACHINE")]

типа отключает защиту и разрешает доступ к реестру?

Автор: mr.DUDA 27.10.2005, 08:51
Цитата(Hidrag @ 26.10.2005, 20:19)
А в чем разница???
Почему работает это?
...
но не работает это?

Работает и то и другое (по крайней мере, не сваливается smile), но создаёт разные разделы реестра. В первом случае путь содержит строку "WindowsNT" (без пробела), во втором - "Windows NT" (с пробелом). Правильный - второй вариант.

Цитата(Hidrag @ 26.10.2005, 20:19)
И (сейчас наверное в глаз получу) что делает эта строка?

Это атрибут, расположенный на уровне assembly (об этом говорит префикс "assembly:"). RegistryPermissionAttribute относится к целому ряду атрибутов из System.Security.Permissions, обеспечивающих механизм декларативной безопасности - одного из двух механизмов поддержки безопасности на уровне кода в .NET Framework (есть ещё безопасность на основе ролей). Подробнее почитать об этом можно у Троелсена или http://msdn.microsoft.com/library/rus/default.asp?url=/library/RUS/cpguide/html/cpcondeclarativesecurity.asp.

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