29. juni 2010 - 18:41 Der er 8 kommentarer og
1 løsning

Registry SØG for specifik key .

HEJ

I Windows kan du gå ind i Registry og søge efter en specifik key -
eksempelvis winword.exe .

Noget tid efter (typisk sekunder) får du så denne specifikke key med total sti til MSWord.

Jeg har brug for en function (procedure ?) som med "Winword.exe " som (string-) parameter returnerer "C:\Programfiler\Office\office10\Winword.exe " fra registry'et.

(Årsagen til denne noget "beskårne" link adresse er, at jeg skal bruge den til ANDRE søg i reg-basen. På programmer, filer, etc. hvor jeg kun har navnet, men det er LATID stien som skal returneres.)

Jeg har en OLD-gammel FileFind funktion, som gør dette arbejde, men den scanner gennem hele disken -- det tager en (hel(censur)es) tid. Nu er det tid at modernisere..


TAK PÅ FORKANT
KRISTIAN
Avatar billede hrc Mester
29. juni 2010 - 22:32 #1
Både mht. søgning af filer og med søgning i registreringsdatabasen kan du begrænse omfanget. Der er ingen grund til at søge i Documents and Settings/Users, bare nøjes med %ProgramDir%. Ligeledes bør du kunne begrænse søgningen til Current_User.

Jeg fandt dette her på experts-exchange (scroll helt ned i bunden). Det er noget med multitrådet søgning og det lyder ret hurtigt: http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_23162742.html - har ingen Delphi på denne PC men har snuppet koden da det lyder interessant.
Avatar billede hugopedersen Nybegynder
30. juni 2010 - 06:47 #2
hrc-> vi andre dødelige der ikke abonnerer på Expert Exchange kan ikke se sådan en løsning :-)
Avatar billede hrc Mester
30. juni 2010 - 08:44 #3
Jamen, jeg abonnerer ikke på den. Jeg har altid kunne se løsningen helt nede i bunden. Man skal bare scrolle en halv kilometer.
Overvejer dog at få firmaet med på et abonnement selvom jeg synes det er ret dyrt.
Avatar billede hrc Mester
30. juni 2010 - 08:46 #4
Kopieret fra Experts-exchange (håber det er OK med dem):

DFM-filen:
object Form1: TForm1
  Left = 325
  Top = 82
  Width = 651
  Height = 599
  Caption = 'Registry Lookup Thread Test'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object HKCRMemo: TMemo
    Left = 0
    Top = 0
    Width = 321
    Height = 186
    Lines.Strings = (
      'HKCRMemo')
    ReadOnly = True
    ScrollBars = ssBoth
    TabOrder = 0
    WordWrap = False
  end
  object HKCUMemo: TMemo
    Left = 320
    Top = 0
    Width = 321
    Height = 186
    Lines.Strings = (
      'HKCUMemo')
    ReadOnly = True
    ScrollBars = ssBoth
    TabOrder = 1
    WordWrap = False
  end
  object HKLMMemo: TMemo
    Left = 0
    Top = 185
    Width = 321
    Height = 186
    Lines.Strings = (
      'HKLMMemo')
    ReadOnly = True
    ScrollBars = ssBoth
    TabOrder = 2
    WordWrap = False
  end
  object HKUMemo: TMemo
    Left = 320
    Top = 185
    Width = 321
    Height = 186
    Lines.Strings = (
      'HKUMemo')
    ReadOnly = True
    ScrollBars = ssBoth
    TabOrder = 3
    WordWrap = False
  end
  object HKCCMemo: TMemo
    Left = 0
    Top = 375
    Width = 321
    Height = 186
    Lines.Strings = (
      'HKCCMemo')
    ReadOnly = True
    ScrollBars = ssBoth
    TabOrder = 4
    WordWrap = False
  end
  object Button1: TButton
    Left = 325
    Top = 375
    Width = 316
    Height = 161
    Caption = 'Do Test'
    TabOrder = 5
    OnClick = Button1Click
  end
  object StaticText1: TStaticText
    Left = 325
    Top = 540
    Width = 311
    Height = 17
    Alignment = taCenter
    AutoSize = False
    BevelInner = bvNone
    BevelKind = bkTile
    BorderStyle = sbsSingle
    Caption = 'Total Time : N/A'
    TabOrder = 6
  end
  object Timer1: TTimer
    OnTimer = Timer1Timer
    Left = 390
    Top = 530
  end
end


PAS-filen:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Registry, ExtCtrls;

type
  TRegistryThread = class(TThread)
  private
    procedure RegistrySearch(KeyName: String);
  protected
    procedure Execute; override;
  public
    RegistryHKey : HKEY;
    Memo : TMemo;
  end;

type
  TForm1 = class(TForm)
    HKCRMemo: TMemo;
    HKCUMemo: TMemo;
    HKLMMemo: TMemo;
    HKUMemo: TMemo;
    HKCCMemo: TMemo;
    Button1: TButton;
    StaticText1: TStaticText;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    function RunThread(RegistryHKey: HKEY; Memo: TMemo): TRegistryThread;
    procedure ThreadTerminated(Sender: TObject);
  public
    rtHKCR, rtHKCU, rtHKLM, rtHKU, rtHKCC : TRegistryThread;
  end;

var
  Form1 : TForm1;
  TotalDone : Integer = 0;
  TotalSeconds : Integer = 0;

implementation

{$R *.dfm}

procedure TRegistryThread.RegistrySearch(KeyName: String);
var
  Reg : TRegistry;
  Names : TStringList;
  Delimiter : String;
  I : Integer;
begin
  Reg := TRegistry.Create;
  Names := TStringList.Create;
  Reg.RootKey := RegistryHKey;
  Try
    If Reg.OpenKeyReadOnly(KeyName) Then
      begin
      If Reg.HasSubKeys Then
        begin
        Reg.GetKeyNames(Names);
        For I := 0 To Names.Count - 1 Do
          begin
          Memo.Lines.Add(KeyName + '\' + Names.Strings[I]);
          SendMessage(Memo.Handle, EM_SCROLLCARET, 0, 0);
          RegistrySearch(KeyName + '\' + Names.Strings[I]);
        end;
      end;
    end;
  finally
    Reg.Free;
    Names.Free;
  end;
end;

procedure TRegistryThread.Execute;
var
  Reg : TRegistry;
  Names : TStringList;
  Delimiter : String;
  I : Integer;
begin
  inherited;
  Reg := TRegistry.Create;
  Names := TStringList.Create;
  Reg.RootKey := RegistryHKey;
  Try
    If Reg.OpenKeyReadOnly('\') Then
      begin
      Reg.GetKeyNames(Names);
      For I := 0 To Names.Count - 1 Do
        begin
        Memo.Lines.Add('\' + Names.Strings[I]);
        RegistrySearch('\' + Names.Strings[I]);
      end;
    end;
  finally
    Reg.Free;
    Names.Free;
  end;
end;

procedure TForm1.ThreadTerminated(Sender: TObject);
begin
  Inc(TotalDone);
end;

function TForm1.RunThread(RegistryHKey: HKEY; Memo: TMemo): TRegistryThread;
var
  RegistryThread : TRegistryThread;
begin
  RegistryThread := TRegistryThread.Create(True);
  RegistryThread.FreeOnTerminate := True;
  RegistryThread.RegistryHKey := RegistryHKey;
  RegistryThread.Memo := Memo;
  RegistryThread.OnTerminate := ThreadTerminated;
  RegistryThread.Resume;
  Result := RegistryThread;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  HKCRMemo.Clear;
  HKCUMemo.Clear;
  HKLMMemo.Clear;
  HKUMemo.Clear;
  HKCCMemo.Clear;
  rtHKCR := RunThread(HKEY_CLASSES_ROOT,HKCRMemo);
  rtHKCU := RunThread(HKEY_CURRENT_USER,HKCUMemo);
  rtHKLM := RunThread(HKEY_LOCAL_MACHINE,HKLMMemo);
  rtHKU := RunThread(HKEY_USERS,HKUMemo);
  rtHKCC := RunThread(HKEY_CURRENT_CONFIG,HKCCMemo);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  Application.ProcessMessages;
  If TotalDone < 1 Then
    begin
    Inc(TotalSeconds);
    StaticText1.Caption := 'Current Time: ' + IntToStr(TotalSeconds) + 's';
  end
  Else
    begin
    StaticText1.Caption := 'Total Time: ' + IntToStr(TotalSeconds) + 's';
  end;
  Timer1.Enabled := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.DoubleBuffered := True;
  HKCRMemo.DoubleBuffered := True;
  HKCUMemo.DoubleBuffered := True;
  HKLMMemo.DoubleBuffered := True;
  HKUMemo.DoubleBuffered := True;
  HKCCMemo.DoubleBuffered := True;
end;

end.
Avatar billede hugopedersen Nybegynder
30. juni 2010 - 08:51 #5
OK - jeg har aldrig haft held med at finde noget på den måde.

Jeg tror du har hacket dem :-)
Avatar billede hrc Mester
30. juni 2010 - 10:47 #6
Måske har de ondt af mig og mener jeg har brug for at lære lidt mere... Ikke hacking, simpel medlidenhed.
Avatar billede Slettet bruger
30. juni 2010 - 18:04 #7
Brug Google, og søg på:
experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_23162742.html

Når det går gennem Google, kan man se løsningen på experts-exchange.

:-)
16. juli 2010 - 00:23 #8
HEJ

Jeg fandt ud af det. Her er koden..

USES
  Registry; .....



procedure TForm1.Button1Click(Sender: TObject);
VAR
  TekstSti : String;
  Reg      : Tregistry;
begin
  reg := Tregistry.Create;
  with reg do
      begin
        RootKey := HKEY_LOCAL_MACHINE;
        openkey('Software\Microsoft\Windows\CurrentVersion\App Paths\Winword.exe', true);
        TekstSti := (Readstring('Path')+ 'Winword.exe');
      end;
  ShowMessage(Tekststi);

  Reg.Free;
end;
18. september 2010 - 12:28 #9
LUKKER TRÅDEN
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