Содержание материала

 

 

Code:

{******************************************}

{3. by Michael Winter }

 

procedure RaiseWin32Error(Code: Cardinal);

var

Error: EWin32Error;

begin

Error := EWin32Error.CreateResFmt(@SWin32Error, [Code,

   SysErrorMessage(Code)]);

Error.ErrorCode := Code;

raise Error;

end;

 

// Write REG_MULTI_SZ

procedure TForm1.Button1Click(Sender: TObject);

const

Str = 'multiple'#0'strings'#0'in one'#0'registry'#0'value'#0;

var

Reg: TRegistry;

Res: Integer;

begin

Reg := TRegistry.Create;

try

   Reg.RootKey := HKEY_CURRENT_USER;

   if not Reg.OpenKey('\Software\Test\RegMultiSzTest', true) then

     raise Exception.Create('Can''t open key');

   Res := RegSetValueEx(

     Reg.CurrentKey,     // handle of key to set value for

     'TestValue',        // address of value to set

     0,                  // reserved

     REG_MULTI_SZ,       // flag for value type

     PChar(Str),         // address of value data

     Length(Str) + 1);   // size of value data

   if Res <> ERROR_SUCCESS then

     RaiseWin32Error(Res);

finally

   Reg.Free;

end;

end;

 

// Read REG_MULTI_SZ

procedure TForm1.Button2Click(Sender: TObject);

var

Reg: TRegistry;

DataType: Cardinal;

DataSize: Cardinal;

Res: Integer;

Str: String;

i: Integer;

begin

Reg := TRegistry.Create;

try

   Reg.RootKey := HKEY_CURRENT_USER;

   if not Reg.OpenKeyReadOnly('\Software\Test\RegMultiSzTest') then

     raise Exception.Create('Can''t open key');

  DataSize := 0;

   Res := RegQueryValueEx(

     Reg.CurrentKey,     // handle of key to query

     'TestValue',        // address of name of value to query

     nil,                // reserved

     @DataType,          // address of buffer for value type

     nil,                // address of data buffer

     @DataSize);         // address of data buffer size

   if Res <> ERROR_SUCCESS then

     RaiseWin32Error(Res);

   if DataType <> REG_MULTI_SZ then

     raise Exception.Create('Wrong data type');

   SetLength(Str, DataSize - 1);

   if DataSize > 1 then begin

     Res := RegQueryValueEx(

       Reg.CurrentKey,     // handle of key to query

       'TestValue',        // address of name of value to query

       nil,                // reserved

       @DataType,          // address of buffer for value type

       PByte(Str),         // address of data buffer

       @DataSize);         // address of data buffer size

     if Res <> ERROR_SUCCESS then

       RaiseWin32Error(Res);

   end;

 

  for i := Length(Str) downto 1 do

     if Str[i] = #0 then

       Str[i] := #13;

   ShowMessage(Str);

finally

   Reg.Free;

end;

end;

 Взято с сайта https://www.swissdelphicenter.ch/en/tipsindex.php

 

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить