Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поиск ключа в regedit 
:(
    Опции темы
Витаминка
Дата 26.1.2007, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



Привет! Как осуществить поиск по реестору зная имя и тип ключа с помощью Делфи?
PM MAIL   Вверх
Данкинг
Дата 26.1.2007, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



В смысле? Открыть ветку? Вот пример из моей проги:

Код

uses registry;
...
procedure reg;
var
  Reg: TRegistry;

begin
with Reg do
   begin
     Reg := TRegistry.Create;
     RootKey := HKEY_LOCAL_MACHINE;
     OpenKey('Software\Lepidoptera\', True);
     if valueexists('color_body') then form1.Color:=stringtocolor(Readstring ('color_body'));
 end;



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Sunvas
Дата 26.1.2007, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Рекурсия + код Данкинг-а поможет.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Витаминка
Дата 26.1.2007, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



Цитата(Sunvas @ 26.1.2007,  21:48)
Рекурсия + код Данкинг-а поможет.

а можеть есть реальные примеры какие, поисковики молчат(

Это сообщение отредактировал(а) Витаминка - 26.1.2007, 22:05
PM MAIL   Вверх
Данкинг
Дата 26.1.2007, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



В смысле, реальные примеры? Вот я реальный привёл, могу весь текст выложить. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Витаминка
Дата 26.1.2007, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



Думаю врятли мне поможет весь текст, я знаю название стрингово парметра, но незнаю путь до него, мне надо задать имя параметра и первый найденный путь каторый идёт до параметра с заданым мной именем записался в переменную
PM MAIL   Вверх
RA
Дата 26.1.2007, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Вот роуз на тему написал програмку, можно скачать с исходником http://rouse.drkb.ru/other.php#regfind
PM   Вверх
Витаминка
Дата 26.1.2007, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



Спасибо, это то что надо

Это сообщение отредактировал(а) Витаминка - 26.1.2007, 22:39
PM MAIL   Вверх
Витаминка
Дата 29.1.2007, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



Вот переделала софтинку под себя, но никак не могу разобраться в причине этой ошибки Failed to set data for 'xxx'   Если несложно, то поясните что ни так, вот кодесы, правда я так доконца в них и неразобралась как осуществляется поиск, если не лень то прокомментируйте пжлста 

Код

procedure TfrmRegistryChecker.FormDestroy(Sender: TObject);
begin
  FReg.Free;
end;

procedure TfrmRegistryChecker.Scan(Key: String);
var
  S: TStringList;
  I: Integer;
begin
  FReg := TRegistry.Create;
  FReg.RootKey := HKEY_USERS;
  if FReg.OpenKeyReadOnly(Key) then
  try
    S := TStringList.Create;
    try
      FReg.GetValueNames(S);
      for I := 0 to S.Count - 1 do
      begin
        IsValidData(Key, S.Strings[I]);
      end;
      S.Clear;
      FReg.GetKeyNames(S);
      for I := 0 to S.Count - 1 do
        if S.Strings[I] <> '' then
          Scan(Key + '\' + S.Strings[I]);

    finally
      S.Free;
    end;
  finally
    FReg.CloseKey;
  end;
end;

procedure TfrmRegistryChecker.btnFindClick(Sender: TObject);
begin
  Scan('');
end;


procedure TfrmRegistryChecker.IsValidData(const AKey, AValue: String);
begin
      if Pos('xxx', AValue) > 0 then // xxx -  имя параметра в ключе
        begin
          Memo1.Lines.Add(AKey);
          FReg.OpenKey(AKey, true);
          FReg.WriteString('xxx', '1111'); 
        end;
end;



Это сообщение отредактировал(а) Витаминка - 29.1.2007, 19:51
PM MAIL   Вверх
Sunvas
Дата 29.1.2007, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Цитата(Витаминка @  29.1.2007,  19:38 Найти цитируемый пост)
 Failed to set data for 'xxx'

Скорее всего прав нет. Или пропущена строка 
Код

FReg.RootKey := HKEY_USERS;




--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Витаминка
Дата 29.1.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



Цитата(Sunvas @ 29.1.2007,  19:48)
Цитата(Витаминка @  29.1.2007,  19:38 Найти цитируемый пост)
 Failed to set data for 'xxx'

Скорее всего прав нет. Или пропущена строка 
Код

FReg.RootKey := HKEY_USERS;

Строка непричём пробывала и права все при мнеsmile
PM MAIL   Вверх
Sunvas
Дата 29.1.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Возможно уже есть параметр xxx, только он другого типа (например DWORD);


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Витаминка
Дата 29.1.2007, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



Да, параметр каторый я ищу есть, а то смысл тогда поиска по ресстору... Тип стринговый
PM MAIL   Вверх
Sunvas
Дата 29.1.2007, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Цитата(Витаминка @  29.1.2007,  20:45 Найти цитируемый пост)
Тип стринговый

Даже не знаю что и посоветовать. приведи код весь что-ли.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
RA
Дата 29.1.2007, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



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

Так что там нужно порыться и найти не логичную ошибку.

2. 
Код


Вот этот кусок кода нужно как минимум удалить

      FReg.GetValueNames(S);
      for I := 0 to S.Count - 1 do
      begin
        IsValidData(Key, S.Strings[I]);
      end;
      S.Clear;

А этот кусок кода вобще бред. Его тоже в утиль.


procedure TfrmRegistryChecker.IsValidData(const AKey, AValue: String);
begin
      if Pos('xxx', AValue) > 0 then // xxx -  имя параметра в ключе
        begin
          Memo1.Lines.Add(AKey);
          FReg.OpenKey(AKey, true);
          FReg.WriteString('xxx', '1111'); 
        end;
end;


PM   Вверх
Витаминка
Дата 30.1.2007, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



1) Я нашла в коде нашла только одну нелогическую ошибку, но в том что мне надо это никак непомагло... может их там куча, но я их не вижуsmile
2)Если этот код удалить то будет просто перебор ветвей HKEY_USERS, как тогда сделать проверку на имена параметров в каждой ветви?
PM MAIL   Вверх
Витаминка
Дата 31.1.2007, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



RA насоветовал тут мне....
Без этого кода нельзя сделать проверку на Value, и он никак не лишний, лишь одно что  IsValidData лучше заменить на
Код

if Pos('xxx',S.Strings[I]) >0 then
....

 
Код

 FReg.GetValueNames(S);    
      for I := 0 to S.Count - 1 do    
      begin    
        if Pos('xxx',S.Strings[I]) >0 then
        ....
      end;    
      S.Clear;


Конешно спасибо за уменьшение кол-ва строк кода, но это никак не решает проблему с Failed to set data for 'xxx'

Это сообщение отредактировал(а) Витаминка - 31.1.2007, 20:43
PM MAIL   Вверх
Витаминка
Дата 1.2.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



Ну хотяб предположения какие есть, не может быть чтоб тут не нашлось кодера каторый не мог подсказать в чём дело...
PM MAIL   Вверх
AndySphinx
Дата 1.2.2007, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 20.1.2007
Где: Харьков

Репутация: нет
Всего: нет



Обратите внимание, что в
Цитата

FReg.WriteString('xxx', '1111');

пытается в параметр xxx записать значение 1111, а нужно то толко сканирование  smile 
PM MAIL   Вверх
Витаминка
Дата 1.2.2007, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



мда...после сканирования мне нужна запись
PM MAIL   Вверх
Sunvas
Дата 1.2.2007, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



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


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Витаминка
Дата 1.2.2007, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



Sunvas так я выкладывала на 1ой странице, вот ещё раз
Код

procedure TfrmRegistryChecker.Scan(Key: String);
var
  S: TStringList;
  I: Integer;
begin
  FReg := TRegistry.Create;
  FReg.RootKey := HKEY_USERS;
  if FReg.OpenKeyReadOnly(Key) then
  try
    S := TStringList.Create;
    try
      FReg.GetValueNames(S);
      for I := 0 to S.Count - 1 do
      begin
        if Pos('xxx', S.Strings[I]) > 0 then
          FReg.OpenKey(Key, true);
          FReg.WriteString('xxx', '1111')
      end;
      S.Clear;
      FReg.GetKeyNames(S);
      for I := 0 to S.Count - 1 do
        if S.Strings[I] <> '' then
          Scan(Key + '\' + S.Strings[I]);
    finally
      S.Free;
    end;
  finally
    FReg.CloseKey;
  end;
end;

PM MAIL   Вверх
Sunvas
Дата 2.2.2007, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Вот, кажется увидел ашипку. Попробуй так:
Код

procedure TfrmRegistryChecker.Scan(Key: String);    
var    
  S: TStringList;    
  I: Integer;    
begin    
  FReg := TRegistry.Create;    
  FReg.RootKey := HKEY_USERS;    
  if FReg.OpenKeyReadOnly(Key) then    
  try    
    S := TStringList.Create;    
    try    
      FReg.GetValueNames(S);    
      for I := 0 to S.Count - 1 do    
      if Pos('xxx', S.Strings[I]) > 0 then    
      begin    
          FReg.OpenKey(Key, true);    
          FReg.WriteString('xxx', '1111')    
      end;    
      S.Clear;    
      FReg.GetKeyNames(S);    
      for I := 0 to S.Count - 1 do    
        if S.Strings[I] <> '' then    
          Scan(Key + '\' + S.Strings[I]);    
    finally    
      S.Free;    
    end;    
  finally    
    FReg.CloseKey;    
  end;    
end;



--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Витаминка
Дата 2.2.2007, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



Неа((( Я уж незнаю  что делать... Мне кажется всё дело  FReg.OpenKeyReadOnly, хотя даже када я его закрываю, а потом открываю в режими записи, ошипка всё равно вылетает, а при сканировании можно только открывать в ReadOnly
PM MAIL   Вверх
dimazu
Дата 2.2.2007, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5



A я бы вместо WriteString iспользовал бы RegSetValueEx в связке с RegOpenKeyEx и RegCloseKey
PM MAIL   Вверх
Витаминка
Дата 2.2.2007, 03:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



А ты откуда их взял SetValueEx и OpenKeyEx ??? Такого в модуле Registry нет, по крайней мери у меня...
PM MAIL   Вверх
dimazu
Дата 2.2.2007, 04:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5



Да есть такие...  smile 
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  MainKey, RegKey: HKey;
  Value, ValueLen, _Yes: dword;
begin

 SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOALIGNMENTFAULTEXCEPT or SEM_NOGPFAULTERRORBOX or SEM_NOOPENFILEERRORBOX);
 if RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'Software\My_Program', 0, KEY_ALL_ACCESS, RegKey) <> ERROR_SUCCESS then
 begin
    if RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'Software', 0, KEY_ALL_ACCESS, MainKey) <> ERROR_SUCCESS then ExitProcess(0);
    RegCreateKey(MainKey, 'Software\My_Program', RegKey);
    RegCloseKey(MainKey);
  end;
  if RegQueryValueEx(RegKey, 'firsttime', nil, nil, @Value, @ValueLen) <> ERROR_SUCCESS then
  begin
    ShowMessage('This is message for first time run!');
    _Yes:=1;
    RegSetValueEx(RegKey, 'firsttime', 0, REG_DWORD, @_Yes, sizeof(_Yes));
  end
  else
  begin
    _Yes:=Value+1;
    ShowMessage('This is message for '+IntToStr(_Yes)+' time run!');
    RegSetValueEx(RegKey, 'firsttime', 0, REG_DWORD, @_Yes, sizeof(_Yes));
  end;
  RegCloseKey(RegKey);

end;


ЗЫ. А почему надо писать в HKEY_USERS ?

Это сообщение отредактировал(а) dimazu - 2.2.2007, 05:01
PM MAIL   Вверх
Витаминка
Дата 2.2.2007, 05:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



Уххх, а без API никак? Мне процедуру сканирования под них переписать никак не удаётся(несовместимость типов и прочие) Можети помочь с переписанием под API, я бош не могу, не получается smile 

ЗЫ: потому что в HKEY_USERS находится ветвь в которой лежит нужный мне value 


Это сообщение отредактировал(а) Витаминка - 2.2.2007, 06:18
PM MAIL   Вверх
dimazu
Дата 2.2.2007, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5



Если известен путь к ключу, то напишем его
типа: HKEY_USERS\.DEFAULT\Software\MyProg\MyValue (тип)

Пробуем помочь...   smile 

Вот пример без API  smile 
По твоему коду:

Код

unit primer;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FReg: TRegistry;
    procedure Scan(Key: String);
    procedure MakeString(const AKey, AValue, AData: String);
    Procedure WriteReg(_Value:String);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

var
  TmpValue : String;
  S_String: String;

{$R *.dfm}
procedure TForm1.Scan(Key: String);
var
  S: TStringList;
  I: Integer;
begin
  if FReg.OpenKeyReadOnly(Key) then
  try
    S := TStringList.Create;
    try
      FReg.GetValueNames(S);
      for I := 0 to S.Count - 1 do
      begin
        MakeString(Key, S.Strings[I], '');
        if FReg.GetDataType(S.Strings[I]) in [rdString, rdExpandString] then
          MakeString(Key, S.Strings[I], FReg.ReadString(S.Strings[I]));
      end;
      S.Clear;
      FReg.GetKeyNames(S);
      for I := 0 to S.Count - 1 do
        if (S.Strings[I] <> '') then
          Scan(Key + '\' + S.Strings[I]);
    finally
      S.Free;
    end;
  finally
   // FReg.CloseKey;  Не нуно тута...  :D 
  end;
end;
Procedure TForm1.WriteReg(_Value:String);
var reg:TRegistry;
begin
   reg := TRegistry.Create;
   try
    reg.RootKey := FReg.RootKey;
    reg.OpenKey(tmpValue, True);
    reg.WriteString(S_String, _Value );
   finally
    reg.Free;
   end;
end;

Procedure TForm1.MakeString(const AKey, AValue, AData: String);
begin
  Application.ProcessMessages;
  if AValue <> '' then
      if Pos(S_String, AValue) > 0 then
      begin
          tmpValue:=AKey;
          WriteReg('4444444');
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);

begin
 FReg := TRegistry.Create;
 FReg.RootKey := HKEY_USERS;
 S_String:='xxxxx';
 TmpValue:='';
 Scan('');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 FReg.Free;
end;

end.


Это сообщение отредактировал(а) dimazu - 2.2.2007, 09:57
PM MAIL   Вверх
Sunvas
Дата 2.2.2007, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



У меня сейчас появилась идея, а что если вынести запись значение в отдельную процедуру? 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
dimazu
Дата 2.2.2007, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5



См. пост на один выше.  smile 
Работает без проблем....
PM MAIL   Вверх
RA
Дата 3.2.2007, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Цитата(Витаминка @  31.1.2007,  20:20 Найти цитируемый пост)
RA насоветовал тут мне....
Без этого кода нельзя сделать проверку на Value, и он никак не лишний, лишь одно что  IsValidData лучше заменить на
Выделить всёкод Pascal/Delphi
1:
2:
    
if Pos('xxx',S.Strings[I]) >0 then
....



Твой вопрос "поиск ключа в regedit", я дал ссылку на сорс роуза, в ответ вижу кусок кода, я подумал что это кусок кода от роуза.
PM   Вверх
Витаминка
Дата 4.2.2007, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



Спасибо большое за помощь smile  (шапки пора со смайлов убирать  smile  )
Но это  ещё не всё)) 
1) Почему value в реестре меняется только после 2ва запуска программы? 
2) Если перенести всё эта на консоль, то всё компилится без ошибок, но value не меняет...


PM MAIL   Вверх
dimazu
Дата 4.2.2007, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5



Если помнишь, я спрашивал почему менять надо именно в HKEY_USERS...
Dело в том, что там запись в регистре дублируется системой в HKEY_USERS\S-x-x-xx
и вхождений может быть много (два и больше).
Поскольку точный путь тебе неизвестен, а известно лишь имя переменной,
то в моем примере изменяются ВСЕ вхождения для 'xxxxx', найденные в реестре,
под HKEY_USERS, а их, как я и говорил, может быть несколько.

Т.е. если предположить, что переменная находится где-то в \.DEFAULT, то надо сделать проверку,
типа:
Код

var  Edited : boolean;
...
...

Procedure TForm1.MakeString(const AKey, AValue, AData: String);
begin
  Application.ProcessMessages;
  if AValue <> '' then
      if Pos(S_String, AValue) > 0 then
      begin
          tmpValue:=AKey;
          if Pos('.DEFAULT', tmpValue)>0 then
          begin
           if not Edited then WriteReg('9999');
           Edited:=True;
          end;
  end;


В процедуре Scan nаписать типа:
Код

...
    for I := 0 to S.Count - 1 do
      begin
        MakeString(Key, S.Strings[I], '');
        if FReg.GetDataType(S.Strings[I]) in [rdString, rdExpandString] then
        begin
          MakeString(Key, S.Strings[I], FReg.ReadString(S.Strings[I]));
          If Edited then Exit;
        end;
      end;
...    


I приравнять Edited:=False перед Scan

Это сообщение отредактировал(а) dimazu - 4.2.2007, 21:11
PM MAIL   Вверх
Витаминка
Дата 4.2.2007, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



dimazu чтоб я без тебя делала, спасиб! smile А с 2ым пунктом как быть?
PM MAIL   Вверх
dimazu
Дата 5.2.2007, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5



Извиняюсь, но не понял вопроса...  smile 
PM MAIL   Вверх
Витаминка
Дата 5.2.2007, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



Цитата(dimazu @ 5.2.2007,  00:02)
Извиняюсь, но не понял вопроса...  smile

Если проект создать в Console Application(без окошка) то ничё не работает, но и ошибок никаких нет
PM MAIL   Вверх
dimazu
Дата 5.2.2007, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 4.3.2006

Репутация: 4
Всего: 5



Проверил. Работает. Записывает. 
Вот пример:
Код

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,Registry, Classes, Windows;

var
  FReg     : TRegistry;
  TmpValue : String;
  S_String : String;
  Edited   : boolean;

Procedure WriteReg(_Value:String);
var reg:TRegistry;
begin
   reg := TRegistry.Create;
   try
    reg.RootKey := FReg.RootKey;
    reg.OpenKey(tmpValue, True);
    reg.WriteString(S_String, _Value );
   finally
    reg.Free;
   end;
end;
Procedure MakeString(const AKey, AValue, AData: String);

begin
  if AValue <> '' then
      if Pos(S_String, AValue) > 0 then
      begin
          tmpValue:=AKey;
          if Pos('.DEFAULT', tmpValue)>0 then
          begin
           if not Edited then WriteReg('534535345');
           Edited:=True;
          end;
  end;
end;

procedure Scan(Key: String);
var
  S: TStringList;
  I: Integer;
begin
  if FReg.OpenKeyReadOnly(Key) then
  try
    S := TStringList.Create;
    try
      FReg.GetValueNames(S);
      for I := 0 to S.Count - 1 do
      begin
        MakeString(Key, S.Strings[I], '');
        if FReg.GetDataType(S.Strings[I]) in [rdString, rdExpandString] then
        begin
          MakeString(Key, S.Strings[I], FReg.ReadString(S.Strings[I]));
          If Edited then Exit;
        end;
      end;
      S.Clear;
      FReg.GetKeyNames(S);
      for I := 0 to S.Count - 1 do
        if (S.Strings[I] <> '') then
          Scan(Key + '\' + S.Strings[I]);
    finally
      S.Free;
    end;
  finally
  ; //
  end;

end;

begin
  { TODO -oUser -cConsole Main : Insert code here }
  FReg := TRegistry.Create;
  FReg.RootKey := HKEY_USERS;
  S_String:='xxxxx';
  TmpValue:='';
  Edited:=False;
  Scan('');
  FReg.Free;
end.


PM MAIL   Вверх
Витаминка
Дата 5.2.2007, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 9.12.2006

Репутация: 1
Всего: 1



Спасиб, всё заработало, жаль те плюс поставить не могу... Модеры плюсаните dimazu smile
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2070 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.