![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перевести 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);