Avatar billede aasuper Nybegynder
15. oktober 2000 - 18:55 Der er 23 kommentarer og
3 løsninger

Ret i registreringsdatabase

Kan nogen give mig en procedure til at rette i registreringsdatabasen i Win2k med?


>>AASuper
Avatar billede picard Nybegynder
15. oktober 2000 - 20:26 #1
meget kort og hurtigt eksempel :O)

procedure RetIReg;
var
Registry: TRegistry;
begin
  Registry:=TRegistry.Create;
  Registry.RootKey:=HKEY_LOCAL_MACHINE;
  If Registry.OpenKey(\'Den nøgle du vil rette i eller oprette\',True) then
    begin
    Registry.WriteString(\'Felt/nøgle der skal rettes\',\'ny værdi\');
Registry.Free;   
end;
end;

Du må uddybe spørgsmålet, hvis du skal have mere hjælp :)

Picard
Avatar billede hatecaps Nybegynder
15. oktober 2000 - 20:29 #2
i NT virker dette
uses
  registry, windows;

procedure TForm1.retireg;
var reg          : TRegistry;
    section      : string;
    laest_vaerdi : integer;
begin
  reg            := TRegistry.create;
  reg.rootkey    := HKEY_LOCAL_MACHINE;
  section        := \'\\SOFTWARE\\Din nøgle\\Din under-nøgle;
  laest_vaerdi  := 0;
  try
    if reg.openkey(section,true) then
    begin
      if reg.valueexists(\'tæller\') then laest_vaerdi := reg.readinteger(\'tæller\');
      reg.writeinteger(\'tæller\',laest_vaerdi+1);
      reg.closekey;
    end;
  finally
    reg.free;
  end;
end;

med mindre du allerede har prøvet det, kan du jo se hvad der sker :-)
Avatar billede picard Nybegynder
15. oktober 2000 - 20:34 #3
Prøv at læse denne her artikel :

http://www.borland.com/delphi/news/zd/1998/jan98/

Her er der en udybning af de forskellige teknikker man bruger i forbindelse med Registry
Avatar billede borrisholt Novice
16. oktober 2000 - 08:16 #4
hatecaps>> Der er vel basalt ingen grund til at erklære en navngiven variabel, når der ikke er brug for at referer til den ... Ydligere så har dit eksempel den svaghed at hvis der op står en fejl (exception) på halvvejen så har du et potientielt memory leak ... I stedet vil jeg foreslå den het syntax :

uses
  registry, windows;

procedure TForm1.RetIReg;
var
    reg          : TRegistry;
    section      : string;
    laest_vaerdi : integer;
begin
  With TRegistry.Create do
  try
    RootKey := HEY_LOCAL_MACHINE;
    Section := \'\\SOFTWARE\\Din nøgle\\Din under-nøgle\';
    laest_vaerdi  := 0;
    if OpenKey(section,true) then
    begin
      ValueExists(\'tæller\') then laest_vaerdi := ReadInteger(\'tæller\');
      WriteInteger(\'tæller\',laest_vaerdi+1);
      CloseKey;
    end;
  finally
    free;
  end;
end;


Jens B
Avatar billede sjensen Nybegynder
16. oktober 2000 - 09:50 #5
aasuper, hatecaps siger at hans eks virker under NT og jeg kan yderligere bekræfte at det også virker under W2K. FDet samme gælder også for borrisholts.

Jens, kan du lige forklare yderligere omkring din bemærkning til hatecaps forslag ? Mener du at fordi han sætter reg := treg...create og først efter bruger try.. final..end at der skulle kunne opstå en graverende fejl i mellem de 2 linier ? Det vil sige at du mener en af disse linier ville kunne betyde at der opstod en fejl der gør at try..final..end ikke udføres:

reg.rootkey    := HKEY_LOCAL_MACHINE;
section        := \'\\SOFTWARE\\Din nøgle\\Din under-nøgle;
laest_vaerdi  := 0;
 
Du må meget undskylde, men jeg kan ikke lige se hvilken, og hvis der er fejl vil det vise sig i design/compile og ikke senere i runtime.

Så selvom dit forslag ser fint ud, og man under alle omstændigheder sparer reg-variablen (som du jo så har glemt at fjerne fra dit forslag), så kan jeg ikke lige få øje på forskellen mellem de 2 forslag.

Avatar billede borrisholt Novice
16. oktober 2000 - 10:50 #6
Forskellen er ens .. I dette tilfælde er den nærmest tænkt. Der jeg var ude efter var brugen af try..finally..enf bloke ... i hele håndteringen af din regisrty ..

jeg har ikke under søgt det men hvad nu hvis du sætter reg.rootkey    := 4711; 

Rejser det ikke en execption ?

Jens B
Avatar billede sjensen Nybegynder
16. oktober 2000 - 11:12 #7
\"..sætter reg.rootkey := 4711; Rejser det ikke en execption ?\"

jo jo, men først ved openkey og den ligger jo inden for try..end.

og sætter man de 2 øvrige vars lig med andre værdier (string = integer og omvendt eller lign.) bør man jo få fejlen i compile. (og er vel i grunden en dårlig programmør)

Nu er det ikke mit eks, men derimod hatecaps, men årsagen til at jeg kommenterer det er at jeg gør det på nøjagtigt samme måde som hatecaps gør. Jeg mener at huske at det stammer fra Borlands eget eks. tilbage fra D2 og jeg formoder at hatecaps har det samme sted fra, uden jeg selvfølgeligt kan være sikker.

Jeg siger ikke at hatecaps eks. er bedre end dit, eller omvendt, og jeg havde ikke planlagt at starte en diskution omkring det, men ville blot lige vide hvad du mente med de kommentarer du skrev. Dels fordi jeg som nævnt gør det på samme måde som hatecaps og derfor gerne ville vide hvad du mener der kan gøres bedre/skirere, og dels fordi jeg i øvrigt har stor respekt for din \"delhi\"-viden gennem de indlæg du har her på eksperten og fra mit besøg på din hjemmeside. 

Så det var ikke for at kritisere dit forslag, blot for at få præciseret at dine kommentarer og sætte det op mod den måde jeg selv gør det på.

I øvrigt vil jeg lige nævne overfor aasuper, at I begge mangler en præcisering af adgangen til registry. Afhængig af hvilken Delphi version der bruges og hvilken user der logger på, samt hvilke keys i registry der skal rettes (i jeres eks. er det kun Local_Machine der er anvendt) vil det være nødvendigt at specificere adgangen med en linie a la

reg.access  := Key_Read;      // kun læs
reg.access  := Key_All_Access; // fuld adgang
o.s.v.

Yderligere skal det nævnes at hvis der brugges D3 vil Borlands Registry unit ikke virke til skrivning (kun læs virker), pga. af en fejl i beregningen af adgangsrettigheder. Det vil være nødvendigt at erstatte den med en anden, f.eks. MyD3Registry (lavet af en franskmand og fundet på Delphi Super Page) alternativt selv rette Borlands unit til.

Avatar billede hatecaps Nybegynder
16. oktober 2000 - 11:12 #8
hmm, HKEY_LOCAL_MACHINE er defineret som DWORD($80000002), så guø ved hvad der sker hvis man sætter rootkey til 4711 (tysk ansigtsvand i øvrigt). Jeg vil mene at der sker præcist det min try..finally..blok går ud på, at reg bliver frigjort når exceptionen opstår under reg.openkey.

Jens, jeg må ærligt sige at jeg er noget skuffet over at du postede dit eksempel som svar. Jeg vidste godt at der er masser af folk som poster en andens svar i modificeret form, men jeg troede egentlig ikke du var en af dem. Essensen i aasupers spørgsmål var hvordan man retter i registreringsdatabasen, hvilket mit svar helt klart gør. At vi så ikke er enige om hvordan try..finally..end bør bruges, retfærdiggører efter min mening ikke at du poster samme teknik en gang til som dit eget svar.

Jeg syntes de fleste folk her på eksperten er gode til at kommenterer andres svar, hvilket som regel starter interesante dialoger, men altid i form af en kommentar. Du må undskylde, men som du har gjort det her, ser det ud som om du prøver at tiltuske dig point, og det tror jeg egentlig ikke du ville.

ha\' det godt

hatecaps
Avatar billede borrisholt Novice
16. oktober 2000 - 11:18 #9
Det var så afgjort en fejl jeg postede min kommentar som et svar, men jeg har ingen mulighed for at trække det tilbage, udover at bede AASuper om at afvise mit svar, og dermed betragte det som en kommentar ...

Hvad der ses tydeligt har jeg taget udgangs punkt i dit eksempel ... af samme grund.

Jeg beklager ...

Jens B
Avatar billede aasuper Nybegynder
16. oktober 2000 - 11:22 #10
Kan procedurerne rette både binær, Dword og strengværdier i registreringsdatabasen?

>>AASuper
Avatar billede hatecaps Nybegynder
16. oktober 2000 - 11:26 #11
ja, hvis du går ind i delphi hjælpen under tregistry/methods kan du se alle tilgængelige read og write metoder, samt hvordan de bruges
Avatar billede aasuper Nybegynder
16. oktober 2000 - 17:38 #12
Tak for svarne. Jeg kan du tilføje Dword og Streng-værdier til reg.databasen.

MEN jeg har en string, som skal konverteres til binær og derefter tilføjes RegDB. Hvordan kan dette gøres?
Avatar billede hatecaps Nybegynder
16. oktober 2000 - 23:34 #13
hmm, ikke for at være penibel, men er dit spørgsmål ikke besvaret allerede ? Dit oprindelige mener jeg :-)

Normalt svarer jeg gerne videre ud over et oprindeligt spørgsmål, men som regel EFTER at jeg har fået pointene.

Kan du præcisere lidt hvordan du vil ha strengen konverteret til binær ?
Avatar billede aasuper Nybegynder
17. oktober 2000 - 11:19 #14
De 30 oprindelige point er nu uddelt, så nu er der 30 ekstra point til den, der kan svare på følgende spørgsmål:


Jeg har fra jer fået procedurer, som kan tilføje string og integer til registreringsdatabasen (som REG_SZ og REG_DWORD).

I registreringsdatabasen findes der, udover disse to typer, en slags, som er af binær type. Hvis jeg så f.eks. har denne værdi som en string: 0101011100110001, hvordan kan jeg så tilføje den til registreringsdatabasen som en REG_BINARY-værdi?


Håber I kan hjælpe.

>>AASuper


Avatar billede aasuper Nybegynder
17. oktober 2000 - 11:20 #15
(Jeg mente de oprindelige 60 point er nu uddelt, der er 30 ekstrapoint til den, som kan løse mit problem ovenover)


>>AASuper
Avatar billede picard Nybegynder
17. oktober 2000 - 11:21 #16
takker :)

Christian
Avatar billede borrisholt Novice
17. oktober 2000 - 11:32 #17
prøv den her :

type
  TMyRegRecord = record
      Value : ShortString;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
MyRegRecord : TMyRegRecord;
begin
  with TRegistry.Create do
  try
    RootKey := HKEY_CURRENT_USER;
    OpenKey(\'\\Software\\Hest\', True);
    MyRegRecord.Value :=  \'Her er en hest\';
    WriteBinaryData(\'HEST\',MyRegRecord,Sizeof(TMyRegRecord));
  finally
    closekey;
    free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
MyRegRecord : TMyRegRecord;
begin
  with TRegistry.Create do
  try
    RootKey := HKEY_CURRENT_USER;
    OpenKey(\'\\Software\\Hest\', True);
    ReadBinaryData(\'HEST\',MyRegRecord, Sizeof(TMyRegRecord));
  finally
    closekey;
    free;
  end;
  Caption := MyRegRecord.Value;
end;

Jens B
Avatar billede aasuper Nybegynder
17. oktober 2000 - 13:37 #18
Tak for det hurtige svar, men det var ikke helt det, jeg mente (jeg formulerede mig vist lidt dårligt).

Jeg vil gerne have denne binær: 0101011100110001 ind i en binærnøgle i registreringsdatabasen...


>>AASuper
Avatar billede borrisholt Novice
17. oktober 2000 - 13:45 #19
Alt så du har en binær værdi 0101011100110001 (22321), som du nske gæmt binært i registerings database ?


Jamme brug det jeg viste dig :

type
  TMyRegRecord = record
      Value : ShortString;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
MyRegRecord : TMyRegRecord;
begin
  with TRegistry.Create do
  try
    RootKey := HKEY_CURRENT_USER;
    OpenKey(\'\\Software\\Hest\', True);
    MyRegRecord.Value :=  \'0101011100110001\';
    WriteBinaryData(\'HEST\',MyRegRecord,Sizeof(TMyRegRecord));
  finally
    closekey;
    free;
  end;
end;



procedure TForm1.Button2Click(Sender: TObject);
var
MyRegRecord : TMyRegRecord;
begin
  with TRegistry.Create do
  try
    RootKey := HKEY_CURRENT_USER;
    OpenKey(\'\\Software\\Hest\', True);
    ReadBinaryData(\'HEST\',MyRegRecord, Sizeof(TMyRegRecord));
  finally
    closekey;
    free;
  end;
  Caption := MyRegRecord.Value;
end;

Jens B
Avatar billede borrisholt Novice
17. oktober 2000 - 13:46 #20
Hvorfor ikke bare gemme det som en string eller en integer ?

PS det kommer ALDRIG til at ligge som 0101011100110001 nede i registerings databasen.

Jens B
Avatar billede aasuper Nybegynder
17. oktober 2000 - 14:27 #21
Det er det, jeg gerne vil have. Når jeg går ind i registreringsdatabasen og kigger, skal det ligge som 0101011100110001.

Det er nok ikke muligt så.


Mit problem består nemlig i, at jeg vil have en bestemt pop3-kode fra Outlook Express ind i registreringsdatabasen på en hel masse computere ved hjælp af et Delphi-program. Outlook Express gemmer koden i Software\\Microsoft\\Internet Account Manager\\Accounts\\00000001 under \"POP3 Password2\". Jeg vil så aflæse den binære værdi direkte fra registreringsdatabasen. Denne værdi skal så tilføjes en nøgle på en anden computer, så der kommer til at stå den nøjagtig samme binære værdi inde i registreringsdatabasen på de 2 computere.

Er det umuligt?


>>AASuper
Avatar billede borrisholt Novice
17. oktober 2000 - 14:37 #22
jooee følg anvisningerne fra før  .. dog er tricket her at vide hvor stor en mængde data du skal læse. Det er der ikke mig bekendt ikke åbnet en mulighed for.


Anders : Det er en meget flot side du har laver. Der er nogle meget pæne eksempler ...(Din AATimer har jeg en gang i øvrigt lavet reverse engineering på). Jeg synes du skulle åbne din kilde kode .. Du ved lige som alle os andere der ikke har noget at skjule :-)

Jens B
Avatar billede aasuper Nybegynder
17. oktober 2000 - 15:38 #23
Dvs. at du ikke ved hvordan man gør...? ;)


>>AASuper
Avatar billede borrisholt Novice
17. oktober 2000 - 15:59 #24
Jo jeg ved godt hvordan man gør jeg har jo demmonsteret teknikken et par gange ...Din opgave er at fortlle mig størelsen på det der skal læses så skal jeg sq nok klare resten ....

Hvad med mit spørgsmål ?

jens B
Avatar billede aasuper Nybegynder
17. oktober 2000 - 16:55 #25
Her har du værdien som HEX, hvis det er det, du mener med størrelse:
0102380036004400310038003600320030000000

Du må gerne fortælle, hvordan du gør!


Dit spørgsmål: Man er da velkommen til at henvende sig via e-mail for at få kildekoden.


>>AASuper
Avatar billede aasuper Nybegynder
18. oktober 2000 - 12:20 #26
Jeg opretter det som et selvstændigt spørgsmål, så det fanger nogen flere\'s opmærksomhed.

>>AASuper
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester