![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с чтением DWORD значения из реестра Win 7 [D7, WinXP]
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: stringAddInfo('Размер приложения:', '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);