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

Вниз

Перевести String в LongWord   Найти похожие ветки 

 
DmitriyR   (2009-05-05 21:35) [0]

Знающие подскажите как перегнать из string в longword.
var
 S: string;
 Key: LongWord;
begin
 S:= "HKEY_LOCAL_MACHINE";
 Key:=LongWord(S)
end;
Не ругается но и результат неверный :(
а вот так результат верный:
var
 Key: LongWord;
begin
 Key:=LongWord(HKEY_LOCAL_MACHINE)
end;

Мож кто подскажет как сделать чтоб заработал вариант 1.
Надо именно через стринг, потому как получаю его в таком виде.
Или может кто подскажет как правильно разобрать reg файл и своими силами закинуть все в реестр, без помощи сторонних программ.


 
@!!ex ©   (2009-05-05 21:38) [1]

if Param="HKEY_LOCAL_MACHINE" then
 Key:=LongWord(HKEY_LOCAL_MACHINE);


 
Игорь Шевченко ©   (2009-05-05 22:08) [2]


> Или может кто подскажет как правильно разобрать reg файл
> и своими силами закинуть все в реестр, без помощи сторонних
> программ.


программу написать надо


 
Denis__ ©   (2009-05-05 23:26) [3]

HKEY_LOCAL_MACHINE - не строка, а константа.


 
Юрий Зотов ©   (2009-05-05 23:53) [4]

> DmitriyR   (05.05.09 21:35)

Есть такой класс - TRegistry. А в справке написано, как его использовать. Даже и с примерами.


 
Германн ©   (2009-05-06 01:36) [5]


> Перевести String в LongWord [D7, XP]
>
> DmitriyR   (05.05.09 21:35)  

Бред!
Купи книжку по Паскалю и изучи её.


 
DmitriyR   (2009-05-06 06:03) [6]

Согласен бред, но решения подсказать неможете.
С описанием проблемм нет все знаю как работает.
И книжку покупать ненадо.

Я же описал в первом посте, открываю REG файл, кто нить заглядывал в него? Мало того что он там в Юникоде (это мелочь решил уже) дык его надо еще разбирать и в реестр импортировать.

пользоватся regedit.exe нельзя, дабы его физически нет.
Надо все сделать из своей проги.
Считать разобрать импортировать.
Считываю файл в буфер, там его разбираю но вот тут косяк получаю все переменные в стрингах :( от чего и возник вопрос натолкнуть на правильное решение а не отправлять читать книгу про работу с реестром с ним то как раз пробемм нет.

Может я вопрос поставил неверно и надо было спросить как правильно разбирать файл.reg чтобы импортировать своими силами без помощи стороннего софта.


 
brother ©   (2009-05-06 06:08) [7]

> Мало того что он там в Юникоде (это мелочь решил уже) дык
> его надо еще разбирать и в реестр импортировать.

всю жизнь думал, что тон в 1251, ща поглядел: и правда - юникод(


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

тебе в [4] ответили


 
DmitriyR   (2009-05-06 06:43) [8]

Ок с этим вроде уже разобрался.
Из буфура вынимаю Мастер кей, Суб кей.
Далее разбор ключей.
Имя ключа вынимаю без проблемм, а вот параметр, со стринг вопросов нет,
а вот с dword и binary ума неприложу как.
получаю строку S:="0000001e" мож тут подскажет кто как ее тоже перегнать в DWORD
А вот строку S:="00,00,00,00,00,00,2F,00,00" я совсем понять немогу как и во что раскидать.


 
MBo ©   (2009-05-06 07:00) [9]

>получаю строку S:="0000001e" мож тут подскажет кто как ее тоже перегнать в DWORD

добавить впереди "$" и StrToInt


 
@!!ex ©   (2009-05-06 07:55) [10]

> [6] DmitriyR   (06.05.09 06:03)
> Согласен бред, но решения подсказать неможете.

И чем не у страивает решение в [1]?


 
palva ©   (2009-05-06 09:26) [11]


> С описанием проблемм нет все знаю как работает.
> И книжку покупать ненадо.


> получаю строку S:="0000001e" мож тут подскажет кто как ее
> тоже перегнать в DWORD

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


 
DmitriyR   (2009-05-06 09:46) [12]

Чтобы внести ясность раскажу:
Программа пишется для WinCE.
перегоняю решения из варианта делфи в вариант FPC + KOL сам.
Делаю программу для востановления ранее сохраненых ключей реестра.
После хард ресета многое приходится востанавливать, вот и решил упростить дело.
Отсюда имею только файлы реестра *.reg их много.
В своей проге я перебираю их все и вношу ключи в реестр.
Отчего и сыр бор разбор этого рег файла и подгонка переменных в нужный вид.
на данном этапе пока незнаю как перегнать строку:
S:="00ff00ff00ff00ff00ff00ff00ff00ff"; < для удобства посчитать 16 hex
Написал функцию:
function MyHexToInt(Value: string): integer;
var
 I: Integer;
begin
//
 Result:= 0;
 I := 1;
 if Value = "" then Exit;
 if Value[ 1 ] = "$" then Inc( I );
 while I <= Length( Value ) do
 begin
   if Value[ I ] in [ "0".."9" ] then
      Result := (Result shl 4) or (Ord(Value[I]) - Ord("0"))
   else
   if Value[ I ] in [ "A".."F" ] then
      Result := (Result shl 4) or (Ord(Value[I]) - Ord("A") + 10)
   else
   if Value[ I ] in [ "a".."f" ] then
      Result := (Result shl 4) or (Ord(Value[I]) - Ord("a") + 10)
   else
     break;
   Inc( I );
 end;
end;  
Но вот беда из за эих 16 hex чисел :(
былобы 8 проблеммы бы небыло.


 
palva ©   (2009-05-06 10:14) [13]

Здесь у вас не "целое число", а "двоичные данные". Соответственно и выходным параметром функции должно быть не целое число, а массив байтов, к примеру. Для универсальности пишите функцию с бестиповым параметром var buffer. Например, можно так:
function MyHexToInt(Value: string; var buffer; int maxlen): integer;
Фукнция заполняет двоичными данными buffer до максимальной длины maxlen, возвращает количество преобразованных байтов или -1 в случае ошибки (неправильная 16-ричная цифра, нечетное число цифр).

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


 
palva ©   (2009-05-06 10:18) [14]


> function MyHexToInt(Value: string; var buffer; int maxlen):
>  integer;

Пардон, по сишному написал. Да и название функции неплохо сменить.
function HexStrToBinData(Value: string; var Buffer; Maxlen: Integer): integer;


 
DmitriyR   (2009-05-06 10:50) [15]

palva прости мож я что непойму :(
к примеру вот:
тоесть в файле идет для примера:
"Shedule"="hex:ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff"

а чтобы загнать его в реестр использую:
RegKeySetBinary(Key: HKey; ValueName: string; cost Buffer; Count: Integer):boolean

Бошка уже кругом идет, подскажите как сию строку загнать в реестр.
Если возможно примером, сил нет уже читать переводы манов.


 
DmitriyR   (2009-05-06 17:34) [16]

Все всем спасибо кто натолкнул на путь истенный и тем кто просто пофлудил :)
Малоли кому то в голову ударит что подобное
Последний вопрос решил так:
function ImportBinaryKey(Buf: string): boolean;
var
 Key: HKey;
 B: array of byte;
 I: integer;
begin
// тут разбираю стринг строку
 SetLength(I, 15);
 For I:= 0 to 15 do B[I]:= //тут заполняю тем что разобрал;

 Key:= RegKeyOpenWrite(HKEY_LOCAL_MACHINE,"Test");
 RegKeySetBinary(Key,"BinaryTest",I, SizeOf(I));
 RegKeyClose(Key);

 result:= True;
end;
Вроде все работает как надо.
Еще раз всем спасибо.


 
Servy ©   (2009-05-06 19:59) [17]

> Вроде все работает как надо.


Ага, SetLength(I, 15) замечательно работает, если I: Integer. Если предположить, что там подразумевалось B, то непонятно, почему обращение идет к 16 элементам массива B, когда в SetLength сказано, что их 15 - выход за границы массива? Также, загадкой является запись в реестр переменной I, значение которой по окончании цикла не определено.


 
DmitriyR   (2009-05-07 06:17) [18]

Ну блин докопался :)
Опечатался. бывает.
function ImportBinaryKey(Buf: string): boolean;
var
Key: HKey;
B: array of byte;
I: integer;
begin
// тут разбираю стринг строку
SetLength(B, 16);
For I:= 0 to (Lenght(B)-1) do B[I]:= //тут заполняю тем что разобрал;

Key:= RegKeyOpenWrite(HKEY_LOCAL_MACHINE,"Test");
RegKeySetBinary(Key,"BinaryTest",B, Length(B));
RegKeyClose(Key);

result:= True;
end;
вроде все поправил

Кстати почемуто работает через раз :(
тоесть если задаю динамический массив то в реестр внесятся значения через раз (правильные/отбалды).
а если делаю статический B: array[0..15] of byte;
то всегда все наместе.


 
palva ©   (2009-05-07 09:03) [19]

Может, так попробовать?

> RegKeySetBinary(Key,"BinaryTest", B[0], Length(B));



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

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

Наверх




Память: 0.52 MB
Время: 0.015 c
2-1242216248
Андрей (начинающий)
2009-05-13 16:04
2009.06.28
Динамическое добавление полей в TTable


15-1240290448
ZeroDivide
2009-04-21 09:07
2009.06.28
"Софт для компьютера"... не, чуваки, "компьютер для софта".


9-1180224380
TTerrain
2007-05-27 04:06
2009.06.28
Сфероид на поверхности Как его разместить равноудалённым от конта


15-1240243040
@!!ex
2009-04-20 19:57
2009.06.28
Как добавить функции в php?


15-1240298284
Int23
2009-04-21 11:18
2009.06.28
Откуда берутся хандлы "левых" событий в моей программе