Форум: "Начинающим";
Текущий архив: 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