Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.08.30;
Скачать: [xml.tar.bz2];

Вниз

Проблема с чтением 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.005 c
6-1205991809
mrfreeman2007
2008-03-20 08:43
2009.08.30
Счетчик посещений


2-1246017930
VoyagerEternal
2009-06-26 16:05
2009.08.30
Как продолжить выполнение программы после искл. ситуации(raise)?


15-1246344627
Виктор85
2009-06-30 10:50
2009.08.30
Посоветуйте хостинг для WebBroker приложения


2-1246427745
lewka
2009-07-01 09:55
2009.08.30
Отправка электроной почты


15-1246449417
@!!ex
2009-07-01 15:56
2009.08.30
Ограничить сеть Virtual Box a





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский