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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поиск ключа в regedit 
:(
    Опции темы
Витаминка
Дата 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   Вверх
Страницы: (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.0550 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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