Registery de Binary değeri okuyup başka yere yazma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Registery de Binary değeri okuyup başka yere yazma

Mesaj gönderen naturelmania »

Arkadaşlar forumda regsitery kontrolünü az çok anladım fakat üzerinde çalıştığım bölümde bir türlü okuma ve yazma işlemini yapamadım.
İşlemcinin hızını belirleyen bölümleri değiştirmek istiyorum. Kullandığım kod bu fakat çalıştıramadım? hata veriyor ve sanırım nasıl okunup nasıl yazılacağını tam anlayamadım?

Kod: Tümünü seç

procedure TForm1.BenzinliClick(Sender: TObject);
var deger: string;
begin
  FullForce.Checked:= False;
  Benzinli.Checked:=True;
  Kepekli.Checked:=False;
  Reg:= TRegistry.Create;
  Reg2:= TRegistry.Create;
  Reg.RootKey:=HKey_Current_User;
  Reg2.RootKey:=HKey_Current_User;
  Reg.OpenKey('\Control Panel\PowerCfg\PowerPolicies\6',False);
  Reg.OpenKey('\Control Panel\PowerCfg\PowerPolicies\3',False);
  Reg.WriteBinaryData('Policies', Reg2.ReadBinaryData('Policies',deger, sizeof(deger)) , sizeof(Reg2.ReadBinaryData('Policies',deger, sizeof(deger)));
  Reg.Closekey;
  Reg.Free;
end;
Örnek aldığım kod ise bu:

Kod: Tümünü seç

Procedure RegYaz(Baslik:String; Deger : dWord); 
var 
  Reg    : TRegistry; 
begin 
  Reg := TRegistry.Create; 
  Reg.RootKey := HKEY_CURRENT_USER; // Dalın ana başlığı seçilir... 
  Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer', False); // ilgili dal açılır... 
  If NOT Reg.ValueExists(Baslik) then Reg.CreateKey(Baslik); // Baslık Yoksa Oluşturulur... 
  Reg.WriteBinaryData(Baslik, Deger, SizeOf(Deger)); // Baslik için değer yazılır... 
  Reg.CloseKey; // Key kapatılır... 
  Reg.Free; 
end;
Yardımcı olursanız ya da yönlendirirseniz sevinirim... Kolay gelsin...
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Merhaba

OpenKey'in son parametresini 'True' yapıp deneyin.

Ek olarak, yazmaya çalıştığınız değeri anlayamadım; hatanın ne olduğunu yazarsanız çözüm bulmamız biraz daha kolaylaşır. :wink:

Kolay gelsin...
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Mesaj gönderen naturelmania »

Afedersiniz unutmuşum hata kodunu:

Kod: Tümünü seç

[Pascal Error] Naturepower.pas(48): E2197 Constant object cannot be passed as var parameter
aynen böyle bir hata alıyorum
Yapmak istediğim işlemcinin hızını artıran veya azaltan bir program yapmaya çalışıyorum. Bunun regeditin altında power policiesin başlığı altında olduğunu buldum. Burda bu anahtarın altında windowstaki bazı hazır güç durumlarını buldum. Ev ofis veya her zaman açık veya maksimum pil gibi...

Ben de kendi power scheme(güç profili sanıyorum) mi oluşturdum. Regeditteki bu profillerin içindeki REG_BINARY değerlerini kopyalamak istiyorum. Bu değeri benim güç profilimin içine yazınca işlemci hızını buna göre değiştirecek yani...
Çok açıklayıcı olamadım ama :(
Burdaki 01 00 10 00 01 10 00 00 gibi yazılı değeri okutmaya çalışıyorum ama bi türlü okutamadım. Sanıyorum bu değer binary sistem. Acaba kodumun içinde nerde hata yapıyor olabilirim?
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Mesaj gönderen naturelmania »

Kod: Tümünü seç

procedure TForm1.BenzinliClick(Sender: TObject);
begin
  FullForce.Checked:= False;
  Benzinli.Checked:=True;
  Kepekli.Checked:=False;
  Reg:= TRegistry.Create;
  Reg2:= TRegistry.Create;
  Reg.RootKey:=HKey_Current_User;
  Reg2.RootKey:=HKey_Current_User;
  Reg.OpenKey('\Control Panel\PowerCfg\PowerPolicies\6',True);
  Reg2.OpenKey('\Control Panel\PowerCfg\PowerPolicies\1',False);
  Reg2.ReadBinaryData('Policies',deger,sizeof(deger));
  Reg.WriteBinaryData('Policies',deger,sizeof(deger));
  Reg.Closekey;
  Reg2.CloseKey;
  Reg.Free;
  Reg2.Free;
end;
Kodu bu hale getirdim ve daha önceki değerleri sadece okuması gerekirken bütün güç politikalarımın binary bölümlerini 00 00 00 00 a çevirdi :cry: napmam lazım? Bu arada birileri Sadece Power Policies bölümünü Registeryden bana export ederse çok sevinirim arkadaşlar zira benim registery yandı bitti kül oldu :cry:
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Merhaba.

Okuma fonksiyonunu yanlış kullanıyor olmayasınız?
örneğin string bir ifade okurken:

deger := Reg.ReadString('Hede'); şeklinde okunuyor.

Büyük ihtimalle binary de
deger := Reg.ReadBinaryData('Hede', Uzunluk); gibi olmalı.

Araştırmalarınıza biraz daha devam ederseniz kararlı kodlar bulacağınıza eminim :roll:

Kolay gelsin.
(Windows'u açınca hem normal reg. ayarlarını göndericem, hem de kod yazıcam; söz)
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam...

- Araştırmadan önce, başka bir fonksiyon ile değerleri doğru okuyup okumadığınızı test etmeliydiniz. Registry kayıtlarına zarar vermek, Windows stabilitesini bozar... :idea:

- Aşağıdaki kod ile veriyi nasıl okumanız gerektiğini kavramanıza yardımcı olmaya çalışıcam. Aynı şekilde okuduğunuz Kaynak değerleri Hedef alana aktarmak imkanı bulacaksınız.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
Var
  Reg   : TRegistry; // Uses Registry
  Deger : array[0..255] of Byte;
  Uz,
  Sayac : Integer;
  Sonuc : String;
begin
  Reg  := TRegistry.Create;
  Reg.RootKey:=HKEY_CURRENT_USER;
  If Reg.OpenKey( '\Control Panel\PowerCfg\PowerPolicies\3', False ) then begin
    Uz := Reg.GetDataSize('Policies');
    Reg.ReadBinaryData( 'Policies', Deger, Uz );
    Reg.CloseKey;
    // Artık elimizde (Uz) uzunluğunda (Deger) değeri var.
      Sonuc     := '';
      For Sayac := 0 to Uz-1 do Sonuc := Format('%s %.2x', [Sonuc, Deger[Sayac]]);
      ShowMessage(Sonuc);
  end;
  Reg.Free;
end;
Test Edilmiştir..

- Balık tutma zamanıdır. 8) Başarılar...
Resim
Resim ....Resim
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Mesaj gönderen naturelmania »

Arkadaşlar ilginize çok teşekkür ederim. Keşke başlamadan önce bir yedek alsaydım tabi program için bu kadar heves yaparsam sonuç böyle oldu :lol:
Yazmış olduğunuz gibi sanırım veriyi okuturken bir sorun çıkıyordu ve registerydeki okuması gereken değeri siliyordu. Şimdi bu vermiş olduğunuz kodları en kısa zamanda deneyip tekrar yazacağım şimdiden teşekkürler :wink:
Kolay gelsin...
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Mesaj gönderen naturelmania »

mrmarman yazdı:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
Var
  Reg   : TRegistry; // Uses Registry
  Deger : array[0..255] of Byte;
  Uz,
  Sayac : Integer;
  Sonuc : String;
begin
  Reg  := TRegistry.Create;
  Reg.RootKey:=HKEY_CURRENT_USER;
  If Reg.OpenKey( '\Control Panel\PowerCfg\PowerPolicies\3', False ) then begin
    Uz := Reg.GetDataSize('Policies');
    Reg.ReadBinaryData( 'Policies', Deger, Uz );
    Reg.CloseKey;
    // Artık elimizde (Uz) uzunluğunda (Deger) değeri var.
      Sonuc     := '';
      For Sayac := 0 to Uz-1 do Sonuc := Format('%s %.2x', [Sonuc, Deger[Sayac]]);
      ShowMessage(Sonuc);
  end;
  Reg.Free;
end;
biraz geç oldu cevabım ama bi türlü okutamadım. Okutmada bir sorunum var Access Violation D000004 gibi bi mesaj veriyo veriyi okumuyor???
Dolayısıyla da yazarken hatalı yazıyordu daha doğrusu değeri sıfırlıyordu... Kodda sorun yoksa aynen yazdım imla hatasını kontrol de ettim program çalışıyor ama okumaya gelince hata veriyor???
var
sen : sevgili;
ben : aşık;
sevgi: aşk;
if ben aşık sana = True then
execute sevgi between(sen,ben);
:)))))
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

"Access Violation" hatası olmayan bir nesneye eriştiğinizde verir. Sorun kodda değil.

- Boş bir proje açın, bir button koyun, USES kısmında da Registry ekleyip deneyin.
Resim
Resim ....Resim
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Mesaj gönderen naturelmania »

Hayret ettim aynı kodları silip tekrar çalıştırdım ve nedense çalıştı.
Yazma işlemini de bitirdim ihtiyacı olan için kodları yolluyorum

Kod: Tümünü seç

procedure TForm1.FullForceClick(Sender: TObject);
begin
  FullForce.Checked:= True;
  Benzinli.Checked:=False;
  Kepekli.Checked:=False;
  Reg  := TRegistry.Create;
  Reg2 := TRegistry.Create;
  Reg.RootKey:=HKEY_CURRENT_USER;
  Reg2.RootKey:=HKEY_CURRENT_USER;
  If Reg.OpenKey( '\Control Panel\PowerCfg\PowerPolicies\3', False ) then begin
    Uz := Reg.GetDataSize('Policies');
    Reg.ReadBinaryData( 'Policies', Deger, Uz );
    Reg.CloseKey;
  end;
  Reg.Free;
  if Reg2.OpenKey( '\Control Panel\PowerCfg\PowerPolicies\6', False ) then begin
    Reg2.WriteBinaryData('Policies',Deger, Uz);
  end;
  Reg2.Free;
end;
Yardımlarınız için teşekkürler. Bütün yardım edenlerden Allah razı olsun...
Program işlemci hızını şimdilik güzel idare ediyor. Windowsun klasik arayüzünden sıkılanlar için programı maillerine bedava yollayabilirim :lol:
var
sen : sevgili;
ben : aşık;
sevgi: aşk;
if ben aşık sana = True then
execute sevgi between(sen,ben);
:)))))
Cevapla