Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Вниз

Как добавить параметр типа REG_MULTI_SZ в реестр ?   Найти похожие ветки 

 
slivka   (2003-11-02 14:10) [0]

WriteBinaryData Записать двоичный набор данных в реестр
WriteBool Записать логические данные
WriteCurrency Записать данные типа деньги
WriteDate Записать данные типа дата-время
WriteDateTime Записать данные типа дата-время
WriteFloat Записать данные типа Double
WriteInteger Записать целое
WriteString Записать строку
WriteTime Записать данные типа дата-время

А вот для записи многострочных данных метода нет.
Как бы это сделать ?


 
Palladin   (2003-11-02 14:12) [1]

Строка это все что заканчивается символом #0, и как понимаешь в остальном наборе могут присутствовать лбые символы, в том числе и #13#10...
Многострочие это таже строка...


 
Anatoly Podgoretsky   (2003-11-02 14:30) [2]

WriteString Записать строку
И приведи свою многострочную строку


 
slivka   (2003-11-02 14:33) [3]

Чего-то я недогоняю.
reg.WriteString("test","192"#13"168"); если написать так то в реестр это запишется так:
test REG_SZ 192(квадрат)168
А вообще надо добится чтобы было:
test REG_MULTI_SZ 192.168.32.95


 
Anatoly Podgoretsky   (2003-11-02 14:39) [4]

Это отображение символа #13, а что бы было так как ты хочешь, надо что бы была точка вместо #13


 
slivka   (2003-11-02 14:47) [5]

Да но так получится
test REG_SZ 192.168.32.95
а должно быть так
test REG_MULTI_SZ 192.168.32.95


 
Anatoly Podgoretsky   (2003-11-02 15:04) [6]

Тогда WriteBinaryData или используй WinApi функции если это не поможет


 
default   (2003-11-02 15:31) [7]

а в реестр вроде можно только писать в одну строку всё...


 
slivka   (2003-11-02 15:36) [8]

WinApi функции, это для меня сложновато я первую прогу пишу.
Можно конечно создать текстовый файл с расширением reg и записать в него такие вот строчки:

REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters\Interfaces\{99466F95-2454-4939-9323-3DECBB337F62}]
"IPAddress"=hex(7):31,39,32,2e,31,36,38,2e,31,36,2e,31,32

Может в Delphi есть какой нибудить способ примастырить к WriteString эту строку:
hex(7):31,39,32,2e,31,36,38,2e,31,36,2e,31,32


 
Anatoly Podgoretsky   (2003-11-02 15:44) [9]

У меня такого ключа нет, но это похоже на binary, во всяком случае это никак не похоже на REG_MULTI_SZ ни на REG_SZ
Возможно, что ты не допонимаешь


 
default   (2003-11-02 15:44) [10]

"REG_MULTI_SZ An array of null-terminated strings, terminated by two null characters."
их хелпа, видимо должно быть что-то вроде
"33434"#0"343434"#0"dgdggffg"#0#0


 
Anatoly Podgoretsky   (2003-11-02 15:44) [11]

И еще дополнительно TRegistry не поддердивает тип REG_MULTI_SZ


 
default   (2003-11-02 15:46) [12]

тогда используй RegSetValueEx


 
slivka   (2003-11-02 15:47) [13]

Если записать так:

REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters\Interfaces\{99466F95-2454-4939-9323-3DECBB337F62}]
"IPAddress"=hex(7):31,39,32,2e,31,36,38,2e,31,36,2e,31,32

получится так:
IPAddress REG_MULTI_SZ 192.168.16.12

Это точно я проверял


 
slivka   (2003-11-02 15:53) [14]

А как использовать RegSetValueEx


 
Anatoly Podgoretsky   (2003-11-02 15:53) [15]

Как проверял, что это именно REG_MULTI_SZ?
Но не важно, придется тебе WinApi изучать


 
default   (2003-11-02 15:54) [16]

slivka (02.11.03 15:53) [14]
можешь мне не верить, но хелп именно для этой цели писался


 
slivka   (2003-11-02 16:02) [17]

Ладно, видимо все это непросто но всеравно спасибо за помощь.


 
Anatoly Podgoretsky   (2003-11-02 16:10) [18]

Нет нельзя сказать, что сложно, но ты ушел от ответа на вопрос, как проверял, что это именно REG_MULTI_SZ?
Посколько даже внешне видно, что это не так, это похоже на binary но не как на REG_MULTI_SZ


 
slivka   (2003-11-02 16:34) [19]

Ну я же написал создается текстовый файл и в него записываются строки:

REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters\Interfaces\{99466F95-2454-4939-9323-3DECBB337F62}]
"IPAddress"=hex(7):31,39,32,2e,31,36,38,2e,31,36,2e,31,32


Потом нужно переименовать расширение у файла (вместо TXT поставить REG). И запустить этот файл.
После этого в ключе:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters\Interfaces\{99466F95-2454-4939-9323-3DECBB337F62}

Создается параметр :

IPAddress REG_MULTI_SZ 192.168.16.12


 
slivka   (2003-11-02 16:41) [20]

Дополненный TRegistry, умеет работать с значениями типа REG_MULTI_SZ (Windows NT, Windows 2000)
------------------------------------------------------------------------------------------------------------------------ --------


unit Reg;
{$R-,T-,H+,X+}

interface

uses Registry, Classes, Windows, Consts, SysUtils;

type

TReg = class(TRegistry)
public
procedure ReadStringList(const name: string; list: TStringList);
procedure WriteStringList(const name: string; list: TStringList);
end;

implementation

//*** TReg *********************************************************************
//------------------------------------------------------------------------------
// Запись TStringList ввиде значения типа REG_MULTI_SZ в реестр
//------------------------------------------------------------------------------

procedure TReg.WriteStringList(const name: string; list: TStringList);
var

Buffer: Pointer;
BufSize: DWORD;
i, j, k: Integer;
s: string;
p: PChar;
begin

{подготовим буфер к записи}
BufSize := 0;
for i := 0 to list.Count - 1 do
inc(BufSize, Length(list[i]) + 1);
inc(BufSize);
GetMem(Buffer, BufSize);
k := 0;
p := Buffer;
for i := 0 to list.Count - 1 do
begin
s := list[i];
for j := 0 to Length(s) - 1 do
begin
p[k] := s[j + 1];
inc(k);
end;
p[k] := chr(0);
inc(k);
end;
p[k] := chr(0);

{запись в реестр}
if RegSetValueEx(CurrentKey, PChar(name), 0, REG_MULTI_SZ, Buffer,
BufSize) <> ERROR_SUCCESS then
raise ERegistryException.CreateResFmt(@SRegSetDataFailed, [name]);
end;
//------------------------------------------------------------------------------
// Чтение TStringList ввиде значения типа REG_MULTI_SZ из реестра
//------------------------------------------------------------------------------

procedure TReg.ReadStringList(const name: string; list: TStringList);
var

BufSize,
DataType: DWORD;
Len, i: Integer;
Buffer: PChar;
s: string;
begin

if list = nil then
Exit;
{чтение из реестра}
Len := GetDataSize(Name);
if Len < 1 then
Exit;
Buffer := AllocMem(Len);
if Buffer = nil then
Exit;
try
DataType := REG_NONE;
BufSize := Len;
if RegQueryValueEx(CurrentKey, PChar(name), nil, @DataType, PByte(Buffer),
@BufSize) <> ERROR_SUCCESS then
raise ERegistryException.CreateResFmt(@SRegGetDataFailed, [name]);
if DataType <> REG_MULTI_SZ then
raise ERegistryException.CreateResFmt(@SInvalidRegType, [name]);
{запись в TStringList}
list.Clear;
s := "";
for i := 0 to BufSize - 2 do
begin // BufSize-2 т.к. последние два нулевых символа
if Buffer[i] = chr(0) then
begin
list.Add(s);
s := "";
end
else
s := s + Buffer[i];
end;
finally
FreeMem(Buffer);
end;
end;

end.


А что это за дополненный TRegistry ?


 
default   (2003-11-02 17:47) [21]

"А что это за дополненный TRegistry ?"
вверху же написано проследнего твоего поста, видишь за тебя всю работы уже сделали


 
slivka   (2003-11-03 16:26) [22]

А как этим воспользоватся ?
Создал я модуль(UNIT2),и вписал туда все то что записано топиком выше. Потом переименовал его в REG.
Затем в модуле (UNIT1) USES вписал REG.
А вот что дальше делать, мне как-то неясно.
Как праметр то добавить в реестр ?


 
slivka   (2003-11-03 17:05) [23]

Может я что-то не так понял ? (хотя я мало чего понял).
Можно даже сказать, совсем ничего не понял.
Подскажите, что с этим кодом делать.

unit Reg;
{$R-,T-,H+,X+}

interface

uses Registry, Classes, Windows, Consts, SysUtils;

type

TReg = class(TRegistry)
public
procedure ReadStringList(const name: string; list: TStringList);
procedure WriteStringList(const name: string; list: TStringList);
end;

implementation

//*** TReg *********************************************************************
//------------------------------------------------------------------------------
// Запись TStringList ввиде значения типа REG_MULTI_SZ в реестр
//------------------------------------------------------------------------------

procedure TReg.WriteStringList(const name: string; list: TStringList);
var

Buffer: Pointer;
BufSize: DWORD;
i, j, k: Integer;
s: string;
p: PChar;
begin

{подготовим буфер к записи}
BufSize := 0;
for i := 0 to list.Count - 1 do
inc(BufSize, Length(list[i]) + 1);
inc(BufSize);
GetMem(Buffer, BufSize);
k := 0;
p := Buffer;
for i := 0 to list.Count - 1 do
begin
s := list[i];
for j := 0 to Length(s) - 1 do
begin
p[k] := s[j + 1];
inc(k);
end;
p[k] := chr(0);
inc(k);
end;
p[k] := chr(0);

{запись в реестр}
if RegSetValueEx(CurrentKey, PChar(name), 0, REG_MULTI_SZ, Buffer,
BufSize) <> ERROR_SUCCESS then
raise ERegistryException.CreateResFmt(@SRegSetDataFailed, [name]);
end;
//------------------------------------------------------------------------------
// Чтение TStringList ввиде значения типа REG_MULTI_SZ из реестра
//------------------------------------------------------------------------------

procedure TReg.ReadStringList(const name: string; list: TStringList);
var

BufSize,
DataType: DWORD;
Len, i: Integer;
Buffer: PChar;
s: string;
begin

if list = nil then
Exit;
{чтение из реестра}
Len := GetDataSize(Name);
if Len < 1 then
Exit;
Buffer := AllocMem(Len);
if Buffer = nil then
Exit;
try
DataType := REG_NONE;
BufSize := Len;
if RegQueryValueEx(CurrentKey, PChar(name), nil, @DataType, PByte(Buffer),
@BufSize) <> ERROR_SUCCESS then
raise ERegistryException.CreateResFmt(@SRegGetDataFailed, [name]);
if DataType <> REG_MULTI_SZ then
raise ERegistryException.CreateResFmt(@SInvalidRegType, [name]);
{запись в TStringList}
list.Clear;
s := "";
for i := 0 to BufSize - 2 do
begin // BufSize-2 т.к. последние два нулевых символа
if Buffer[i] = chr(0) then
begin
list.Add(s);
s := "";
end
else
s := s + Buffer[i];
end;
finally
FreeMem(Buffer);
end;
end;

end.


 
default   (2003-11-03 19:17) [24]

на код смотри - что ж непонятного-то


 
default   (2003-11-03 20:22) [25]


procedure TForm1.Button1Click(Sender: TObject);
var
R: TReg;
SL: TStringList;
begin

try
SL := TStringList.Create;
SL.Add("Первая строка");
SL.Add("Вторая строка");
SL.Add("Третья строка");
try
R := TReg.Create;
R.RootKey := HKEY_CURRENT_USER;
R.OpenKey("TestKey", True);
R.WriteStringList("TestKey", SL);
finally
R.Free
end;
finally
SL.Free
end;
// теперь открываешь REGEDIT и смотришь на результат

end;
</code



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

Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.037 c
1-41365
Элина
2003-10-29 12:01
2003.11.13
DLL и строка


4-42252
Вован
2003-09-15 17:32
2003.11.13
Как заставить свою прогу закрыться при shutdown e Windows?


14-41880
Peter
2003-10-21 17:31
2003.11.13
Scaner2003


1-41369
ddenis
2003-10-30 14:25
2003.11.13
окна в потоках %-)


7-42153
Dmk
2003-09-02 21:19
2003.11.13
PChar





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский