Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с чтением DWORD значения из реестра Win 7 [D7, WinXP]


Страницы:   1 2

Vayrus ©   (2009-06-26 18:26:00) 

Здравствуйте, пишу простенькую программку, но возникла проблема, почему то в Windows 7 не работает следующий код (кракозябры), который прекрасно работает под Win XP:


uses
 Windows,
 SysUtils,
 Registry;

const
 sKey: string = '\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall';//\

var
REG: TRegistry;
I: Integer;

begin
REG:= TRegistry.Create;
try
REG.RootKey := HKEY_LOCAL_MACHINE;
if REG.OpenKeyReadOnly(sKey + '\' + '{1A352E3E-9E02-42EC-8465-76A56095C871}') then
begin
if REG.ValueExists('EstimatedSize') then
begin
I := REG.ReadInteger('EstimatedSize');
Writeln('Read DWORD: ' + IntToStr(I));
end else
Writeln('Value not exists');
REG.CloseKey;
end else
Writeln('Cannot open key');
finally
REG.Free;
end;
Readln;
end.


Пожалуйста, помогите поправить код, чтобы он корректно работал нетолько в Win XP, но и в Win 7.

IDE: CodeGear 2009


Vayrus   (2009-06-27 13:24:00) [1]

Хотя, если верить RegEdit, то это простые строковые и DWORD значения


Vayrus   (2009-06-27 12:24:00) [2]


> Сомнительная конструкция. ИМХО правильнее сначала получить
> тип данных (TRegistry.GetDataType), потом вызвать нужную
> функцию чтения.


Спасибо, точно, учту, может это как то прояснит, что именно я пытаюсь прочесть)


Anatoly Podgoretsky   (2009-06-27 12:17:00) [3]

> Vayrus  (27.06.2009 10:06:12)  [12]

ReadInteger не может быть крякозябрами, он вообще никакой.


Sapersky   (2009-06-27 11:42:00) [4]


  try
    TempStr := Reg.readstring(RegReadStr);
  except
  end;
  if TempStr = '' then
  begin
    try
      TempStr := IntToStr(Reg.ReadInteger(RegReadStr));
    except
    end;
  end;


Сомнительная конструкция. ИМХО правильнее сначала получить тип данных (TRegistry.GetDataType), потом вызвать нужную функцию чтения.


Vayrus   (2009-06-27 11:27:00) [5]


> эт уже FloatToStr


Неправильно выразился: 33456


> ещё лучше


Что это значит?


AIK   (2009-06-27 11:23:00) [6]


> тавишь остановку слева от  AddInfo('Размер приложения: ',
>  'EstimatedSize');


ещё лучше

> if tempStr <> '' then
>   ListBox1.Items.Text := ListBox1.Items.Text +
>     RegDscrStr + #13#10 + TempStr + #13#10#13#10;  { else



> Да, 33000 примерно), с копейками


эт уже FloatToStr


Vayrus   (2009-06-27 11:20:00) [7]

Пишет следующее:

First chance exception at $75A9B4F4. Exception class ERegistryException with message 'Invalid data type for 'Readme''. Process FUnistM.exe (664)
First chance exception at $75A9B4F4. Exception class ERegistryException with message 'Invalid data type for 'Comments''. Process FUnistM.exe (664)
First chance exception at $75A9B4F4. Exception class ERegistryException with message 'Invalid data type for 'Contact''. Process FUnistM.exe (664)
First chance exception at $75A9B4F4. Exception class ERegistryException with message 'Invalid data type for 'URLInfoAbout''. Process FUnistM.exe (664)
First chance exception at $75A9B4F4. Exception class ERegistryException with message 'Invalid data type for 'URLUpdateInfo''. Process FUnistM.exe (664)
First chance exception at $75A9B4F4. Exception class ERegistryException with message 'Invalid data type for 'HelpLink''. Process FUnistM.exe (664)
First chance exception at $75A9B4F4. Exception class ERegistryException with message 'Invalid data type for 'EstimatedSize''. Process FUnistM.exe (664)

Некоторые строковые значения он тоже не читает.
Извинясь перед всеми - туплю с утра)


Vayrus   (2009-06-27 11:15:00) [8]


> Какое там число? Само число корректное?


Да, 33000 примерно), с копейками


AIK   (2009-06-27 11:15:00) [9]

Параметр RegReadStr: string  AddInfo('Размер приложения:', 'EstimatedSize'); получает значения не являющимся текстом или символом, проверил бы глазками что содержит этот ключ в реестре или опять таки откладчиком как не раз уже тебе советовали, ставишь остановку слева от   AddInfo('Размер приложения: ', 'EstimatedSize');(такой красный кружок) и нажимаешь F8 и смотришь что получает второй параметр.


@!!ex   (2009-06-27 11:10:00) [10]

Сорри, с кодом разбираться не буду, своего хватает.

Какое там число? Само число корректное?

P.S.
Как вариант - сделай свою реализацию IntToStr, это не сложно.


Vayrus   (2009-06-27 11:03:00) [11]

Скриншот
http://pic.ipicture.ru/uploads/090627/RJOUP8E7G9.jpg


Vayrus   (2009-06-27 10:59:00) [12]

С консольным приложением и простой формой с этим кодом проблем нет, а вот в моем проекте так и не читает, я явно допустил какую то ошибку, приведу скриншот и полный код модуля получения дополнительной информации:


unit info;

interface

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

type
 TForm3 = class(TForm)
   Button1: TButton;
   ListBox1: TListBox;
   procedure Button1Click(Sender: TObject);
   procedure InfoLoad(path: string);
   procedure AddInfo(RegDscrStr, RegReadStr: string);
   procedure ListBox1DblClick(Sender: TObject);
   procedure ListBox1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form3: TForm3;

implementation

{$R *.dfm}

uses
 main, mainutils;

procedure TForm3.AddInfo(RegDscrStr, RegReadStr: string);
var
 TempStr: string;
begin
 TempStr := '';
 if Reg.ValueExists(RegReadStr) then
 begin
   try
     TempStr := Reg.readstring(RegReadStr);
   except
   end;
   if TempStr = '' then
   begin
     try
       TempStr := IntToStr(Reg.ReadInteger(RegReadStr));
     except
     end;
   end;
   if tempStr <> '' then
     ListBox1.Items.Text := ListBox1.Items.Text +
       RegDscrStr + #13#10 + TempStr + #13#10#13#10; { else
     memo1.Lines.Add('Ошибка чтения "' + RegDscrStr + '"' + #13#10);}
 end;
//  memo1.Lines.Add('Не смог получить данные "' + RegDscrStr + '"' + #13#10);
end;

procedure TForm3.InfoLoad(path: string);
begin
 ListBox1.Clear;
//
 reg := Tregistry.Create;
 try
   Reg.rootkey := HKEY_LOCAL_MACHINE;
   if Reg.openkey(path, false) then
   begin
     {param := Reg.readstring('DisplayName');
     sUnist := Reg.readstring('UninstallString');}
     AddInfo('Путь к программе удаления:', 'UninstallString');
     AddInfo('Иконка, соответствующая приложению в диалоге "Установка и удаление программ":', 'DisplayIcon');
     AddInfo('Путь инсталлятора для изменения установочных параметров программы:', 'ModifyPath');
     AddInfo('Издатель продукта:', 'Publisher');
     AddInfo('Путь к файлу Readme для данного продукта:', 'Readme');
     AddInfo('Комментарии к продукту:', 'Comments');
     AddInfo('Контактное лицо (e-mail и т. п.):', 'Contact');
     AddInfo('Номер версии:', 'DisplayVersion');
     AddInfo('Код продукта:', 'ProductID');
     AddInfo('Зарегистрированная компания:', 'RegCompany');
     AddInfo('Зарегистрированный владелец:', 'RegOwner');
     AddInfo('Ссылка на домашнюю страничку производителя:', 'URLInfoAbout');
     AddInfo('Ссылка на страничку обновления продукта:', 'URLUpdateInfo');
     AddInfo('Ссылка на страничку сведений о поддержке:', 'HelpLink');

     AddInfo('Размер приложения: ', 'EstimatedSize');
     //
     Reg.closekey;
   end else
   begin
     Reg.rootkey := HKEY_CURRENT_USER;
     if Reg.openkey(path, false) then
     begin
       {param := Reg.readstring('DisplayName');
       sUnist := Reg.readstring('UninstallString');}
       AddInfo('Путь к программе удаления:', 'UninstallString');
       AddInfo('Иконка, соответствующая приложению в диалоге "Установка и удаление программ":', 'DisplayIcon');
       AddInfo('Путь инсталлятора для изменения установочных параметров программы:', 'ModifyPath');
       AddInfo('Издатель продукта:', 'Publisher');
       AddInfo('Путь к файлу Readme для данного продукта:', 'Readme');
       AddInfo('Комментарии к продукту:', 'Comments');
       AddInfo('Контактное лицо (e-mail и т. п.):', 'Contact');
       AddInfo('Номер версии:', 'DisplayVersion');
       AddInfo('Код продукта:', 'ProductID');
       AddInfo('Зарегистрированная компания:', 'RegCompany');
       AddInfo('Зарегистрированный владелец:', 'RegOwner');
       AddInfo('Ссылка на домашнюю страничку производителя:', 'URLInfoAbout');
       AddInfo('Ссылка на страничку обновления продукта:', 'URLUpdateInfo');
       AddInfo('Ссылка на страничку сведений о поддержке', 'HelpLink');

       AddInfo('Размер приложения:', 'EstimatedSize');
       //
       Reg.closekey;
     end;
   end;
 finally
   Reg.free;
 end;
//
 Form3.ShowModal;
end;

procedure TForm3.ListBox1Click(Sender: TObject);
begin
 PutStringIntoClipBoard(ListBox1.Items[ListBox1.ItemIndex]);
end;

procedure TForm3.ListBox1DblClick(Sender: TObject);
var
 S: string;
begin
 s := ListBox1.Items[ListBox1.ItemIndex];
 if (POS('WWW', AnsiUpperCase(S)) > 0) or (POS('HTTP', AnsiUpperCase(S)) > 0) then
   ExecAny(S);
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
 Close;
end;

end.


@!!ex   (2009-06-27 10:52:00) [13]

> [26] Vayrus   (27.06.09 10:49)
> Я в курсе, но тут мистика какая то)

За мистическими событиями всегда скрывается элементарная ошибка, поверьте моему большому опыту в вылавливании мистических ошибок.

P.S.
На самом деле опыт не очень большой, потому что пара недель потраченная на вылавливание мистических ошибок напрочь отбивают желание их совершать...


Vayrus   (2009-06-27 10:49:00) [14]


> Я мягко намекнул, что integer НЕ МОЖЕТ Содержать кривые
> данные.
> Уважаемый, не тупите.


Я в курсе, но тут мистика какая то)


Vayrus   (2009-06-27 10:48:00) [15]

Хм, странно, сейчас этот код работает, ничего непонимаю


@!!ex   (2009-06-27 10:43:00) [16]

> [23] Vayrus   (27.06.09 10:42)
> Лично я думаю что не работает именно ReadInteger модуля
> Registry.

Я мягко намекнул, что integer НЕ МОЖЕТ Содержать кривые данные.
Уважаемый, не тупите.


Vayrus   (2009-06-27 10:42:00) [17]


> неправильно работает IntToStr


Скорее всего, так как Writeln я не юзаю, консольник это пример.
Лично я думаю что не работает именно ReadInteger модуля Registry.


@!!ex   (2009-06-27 10:42:00) [18]

кидай. это надо было сделать еще в первом посте.


Vayrus   (2009-06-27 10:39:00) [19]

Могу кинуть скриншоты того что получается, может это как то прояснить ситуацию


@!!ex   (2009-06-27 10:38:00) [20]

> [19] Vayrus   (27.06.09 10:35)

Вывод элиментарный:
не правильно работает writeln
и /или
неправильно работает IntToStr

второе проверяется просто:
Writeln('Read DWORD: ' + IntToStr(I));
Заменяется на:
Writeln('Read DWORD: ');
Writeln(I);


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо