Oprettet tir. d. 29. juni 2010 kl. 18:41:03

snestrup2000
snestrup2000 (8.635 point. Point ude: 0)

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

Skrevet tir. d. 29. juni 2010 kl. 22:32:11| #1

hrc
hrc (32.732 point)
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/ (...) - har ingen Delphi på denne PC men har snuppet koden da det lyder interessant.

Skrevet ons. d. 30. juni 2010 kl. 06:47:43| #2

hrc-> vi andre dødelige der ikke abonnerer på Expert Exchange kan ikke se sådan en løsning :-)

Skrevet ons. d. 30. juni 2010 kl. 08:44:14| #3

hrc
hrc (32.732 point)
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.

Skrevet ons. d. 30. juni 2010 kl. 08:46:42| #4

hrc
hrc (32.732 point)
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.

Skrevet ons. d. 30. juni 2010 kl. 08:51:36| #5

OK - jeg har aldrig haft held med at finde noget på den måde.

Jeg tror du har hacket dem :-)

Skrevet ons. d. 30. juni 2010 kl. 10:47:49| #6

hrc
hrc (32.732 point)
Måske har de ondt af mig og mener jeg har brug for at lære lidt mere... Ikke hacking, simpel medlidenhed.

Skrevet ons. d. 30. juni 2010 kl. 18:04:33| #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.

:-)

Skrevet fre. d. 16. juli 2010 kl. 00:23:11| #8

snestrup2000
snestrup2000 (8.635 point)
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;

Skrevet lør. d. 18. september 2010 kl. 12:28:11| #9


Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Irriterende timeout i Delphi 7 på en win7 64 bits platform

Oprettet den 2. februar 2012 kl. 12.17
nca giver 60 point for svar | Giv et svar »

Manglende danske tegn

Oprettet den 24. januar 2012 kl. 16.12
hugopedersen giver 60 point for svar | Giv et svar »

Sikre mig at form er færdigoprettet

Oprettet den 24. januar 2012 kl. 10.01
hugopedersen giver 100 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger