Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.30;
Скачать: CL | DM;

Вниз

Проблема с чтением DWORD значения из реестра Win 7   Найти похожие ветки 

 
Vayrus   (2009-06-26 18:26) [0]

Здравствуйте, пишу простенькую программку, но возникла проблема, почему то в 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


 
Игорь Шевченко ©   (2009-06-26 22:55) [1]


> почему то в Windows 7 не работает следующий код


какой кошмар!


 
Palladin ©   (2009-06-26 23:01) [2]

причем этот "следующий код" молчит как партизан...
Игорь еще мягко выразился... ) тебя бы темечком об парту


 
Vayrus   (2009-06-26 23:19) [3]


> какой кошмар!


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


 
Vayrus   (2009-06-26 23:21) [4]


> причем этот "следующий код" молчит как партизан...
> Игорь еще мягко выразился... ) тебя бы темечком об парту


Правильно, Вы же не за моим компьютером сидите.
Вам явно мозг черепную коробку давит, если он вообще есть.


 
Palladin ©   (2009-06-26 23:25) [5]


> Вы же не за моим компьютером сидите.

в точку


> Вам явно мозг черепную коробку давит,

ага ) дырки в ушах спасают.... )


 
Игорь Шевченко ©   (2009-06-26 23:48) [6]


> Вам явно мозг черепную коробку давит, если он вообще есть.


А вот что тебе давит - непонятно, потому что ты не только не описал проблему в своем кривом коде, но и не удосужился посмотреть, как он работает. Использовать форум, как отладчик - занятие крайне неблагодарное, потому что проблема у тебя, а не у отвечающих, понял, да ?


 
Германн ©   (2009-06-27 01:44) [7]


> Vayrus   (26.06.09 23:19) [3]
>
>
> > какой кошмар!
>
>

Эт-точно. (с) Товарищ Сухов.
Так бездарно задать вопрос!
Даже в "Начинающим" - это перебор!


 
Vayrus   (2009-06-27 09:30) [8]


> но и не удосужился посмотреть, как он работает.


Не надо придумывать, все я смотрел и как уже говорил выше в Win XP результат возвращаются правильно, а в Win 7 кракозябрами, при том если этот же код компилировать в Delphi 7, то он работает в обеих ОС. А если вам слабо или религия не позволяет вместо данных ключей реестра использовать существующие у вас в реестре, то это уже не мои проблемы, здесь привиден лишь пример чтения DWORD значения.


 
Vayrus   (2009-06-27 09:32) [9]


> в своем кривом коде


Очень он даже прямой, это, возможно, кривой модуль Registry в CodeGear 2009.


 
Vayrus   (2009-06-27 09:45) [10]


> Так бездарно задать вопрос!


Возможно, просто давно не задавал вопросов, да и не умею наверно, а тут вот на тебе), извиняюсь, если мой код ввел кого то в заблуждение)


 
Riply ©   (2009-06-27 09:56) [11]

> [9] Vayrus   (27.06.09 09:32)
>> в своем кривом коде
> Очень он даже прямой,

В точку ! Ты его так выровнял, что и прочитать невозможно :)

> это, возможно, кривой модуль Registry в CodeGear 2009.

Обычно, прежде чем искать соринку  в чужем глазу, вытаскивают бревно из своего :)

P.S.
Кстати, я так и не сумела понять, что за ошиба.
То-ли значение не читается, то-ли не так выводится :)


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


> В точку ! Ты его так выровнял, что и прочитать невозможно
> :)


Его не так уж и много, просто так и скажите что лень читать)


> Обычно, прежде чем искать соринку  в чужем глазу, вытаскивают
> бревно из своего :)


Ответ был ожидаемым)


> Кстати, я так и не сумела понять, что за ошиба.
> То-ли значение не читается, то-ли не так выводится :)


В вопросе в скобках указано, что значение читается, но результат - кракозября, символы произвольной формы, а не численные значения как ожидалось и должно быть.


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

> [12] Vayrus   (27.06.09 10:06)

Расскажи мне, дорогой, как можно в тип Integer запихать какие-то там символы?


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


> Расскажи мне, дорогой, как можно в тип Integer запихать
> какие-то там символы?


Вот и я удивляюсь)


 
@!!ex ©   (2009-06-27 10:24) [15]

> [14] Vayrus   (27.06.09 10:22)

Учи матчасть. Будет проще.
Аккуратненько с помощью брэйкпоинтов и кнопочек F7 и F8 проходишься по коду и смотришь когда и что ломается.


 
Vayrus   (2009-06-27 10:27) [16]


> Учи матчасть. Будет проще.
> Аккуратненько с помощью брэйкпоинтов и кнопочек F7 и F8
> проходишься по коду и смотришь когда и что ломается.


Дело в том что ничего и не ломается, но все равно спасибо


 
@!!ex ©   (2009-06-27 10:30) [17]

> [16] Vayrus   (27.06.09 10:27)

Вот как! И какже у нас выводятся кракозябры, если ничего неломается?


 
@!!ex ©   (2009-06-27 10:30) [18]

Или это штатное поведение?:


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


> Вот как! И какже у нас выводятся кракозябры, если ничего
> неломается?


Знал бы - не спрашивал


> Или это штатное поведение?:


Прогнал под отладчиком - все нормально, ничего не вылетает, возможно не так прогнал, хотя тут, как оказалось, ничего сложного)


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

> [19] Vayrus   (27.06.09 10:35)

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

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


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

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


 
@!!ex ©   (2009-06-27 10:42) [22]

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


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


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


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


 
@!!ex ©   (2009-06-27 10:43) [24]

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

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


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

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


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


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


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


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

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

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

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


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

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


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.


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

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


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

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

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

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


 
AIK ©   (2009-06-27 11:15) [31]

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


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


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


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


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

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

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)

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


 
AIK ©   (2009-06-27 11:23) [34]


> тавишь остановку слева от  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:27) [35]


> эт уже FloatToStr


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


> ещё лучше


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


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


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


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


 
Anatoly Podgoretsky ©   (2009-06-27 12:17) [37]

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

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


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


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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2009.08.30;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.017 c
1-1212999896
Separator
2008-06-09 12:24
2009.08.30
Построение и расчет графов


15-1246370688
Пит
2009-06-30 18:04
2009.08.30
WEB <-> Настройки <-> БД


1-1213454201
cavalera
2008-06-14 18:36
2009.08.30
Почему не хочет загружаться процедура из dll.


15-1246255244
TUser
2009-06-29 10:00
2009.08.30
Делюсь ссылочкой на детскую передачу


15-1246451106
@!!ex
2009-07-01 16:25
2009.08.30
ЗИЛ в Германии 45 года????