Форум: "Основная";
Текущий архив: 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.033 c