Форум: "Начинающим";
Текущий архив: 2009.06.28;
Скачать: [xml.tar.bz2];
ВнизПеревести 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.005 c