Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1241695713
Pavlov
2009-05-07 15:28
2009.06.28
Сохранить и удалить данные на жесткий диск


3-1222915555
Татьяна
2008-10-02 06:45
2009.06.28
Lookup поля в таблицах.


2-1242153875
Fynjy
2009-05-12 22:44
2009.06.28
FormKeyDown


15-1240751506
radium
2009-04-26 17:11
2009.06.28
Округление географических координат


15-1240390178
31512
2009-04-22 12:49
2009.06.28
Помогите с batаникой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский