Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перевести String в LongWord [D7, XP]


DmitriyR ©   (2009-05-05 21:35:00) 

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


palva   (2009-05-07 09:03:00) [1]

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

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


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

Ну блин докопался :)
Опечатался. бывает.
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;
то всегда все наместе.


Servy   (2009-05-06 19:59:00) [3]

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


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


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

Все всем спасибо кто натолкнул на путь истенный и тем кто просто пофлудил :)
Малоли кому то в голову ударит что подобное
Последний вопрос решил так:
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;
Вроде все работает как надо.
Еще раз всем спасибо.


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

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

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


palva   (2009-05-06 10:18:00) [6]


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

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


palva   (2009-05-06 10:14:00) [7]

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

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


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

Чтобы внести ясность раскажу:
Программа пишется для 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 09:26:00) [9]


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


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

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


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

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

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


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

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

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


DmitriyR   (2009-05-06 06:43:00) [12]

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


brother   (2009-05-06 06:08:00) [13]

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

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


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

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


DmitriyR   (2009-05-06 06:03:00) [14]

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

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

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

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


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


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

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


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

> DmitriyR   (05.05.09 21:35)

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


Denis__   (2009-05-05 23:26:00) [17]

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


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


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


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


@!!ex   (2009-05-05 21:38:00) [19]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо