Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как читать REG_MULTI_SZ значение? 
:(
    Опции темы
Poseidon
Дата 9.6.2005, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Код
uses 
  Registry; 

procedure ReadREG_MULTI_SZ(const CurrentKey: HKey; const Subkey, ValueName: string; 
  Strings: TStrings); 
var 
  valueType: DWORD; 
  valueLen: DWORD; 
  p, buffer: PChar; 
  key: HKEY; 
begin 
  // Clear TStrings 
  Strings.Clear; 
  // open the specified key 
  if RegOpenKeyEx(CurrentKey, 
                  PChar(Subkey), 
                  0, KEY_READ, key) = ERROR_SUCCESS then 
  begin 
    // retrieve the type and data for a specified value name 
    SetLastError(RegQueryValueEx(key, 
                 PChar(ValueName), 
                 nil, 
                 @valueType, 
                 nil, 
                 @valueLen)); 
    if GetLastError = ERROR_SUCCESS then 
      if valueType = REG_MULTI_SZ then 
      begin 
        GetMem(buffer, valueLen); 
        try 
          // receive the value's data (in an array). 
          RegQueryValueEx(key, 
                          PChar(ValueName), 
                          nil, 
                          nil, 
                          PBYTE(buffer), 
                          @valueLen); 
          // Add values to stringlist 
          p := buffer; 
          while p^ <> #0 do 
          begin 
            Strings.Add(p); 
            Inc(p, lstrlen(p) + 1) 
          end 
        finally 
          FreeMem(buffer) 
        end 
      end 
      else 
        raise ERegistryException.Create('Stringlist expected/ String Liste erwartet...') 
    else 
      raise ERegistryException.Create('Cannot Read MULTI_SZ Value/'+ 
        'Kann den MULTI_SZ Wert nicht lesen...'); 
  end; 
end; 

// Test it: 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  ReadREG_MULTI_SZ(HKEY_CURRENT_USER, 'Software\XYZ', 'Test44', Memo1.Lines); 
end; 



Код
{2. by Ralph Friedman } 


 Question: 
 I want to read out the binary-value "problems" of the path 
 HKEY_DYN_DATA\Config Manager\Enum\[add the key of a hardware component] to 
 detect if a hardware component is troubled and not working right. 
 But I cannot handle the ReadBinaryData-Method of TRegistry correct. 
 Everytime I use it, it always returns "4" as content of the buffer. 
 How do I detect if the content of the binary-key "problems" is 
 not "00 00 00 00" but something else like "16 00 00 00" or such? 


{Answer: Here's an example of ReadBinaryData } 


procedure TFrmReadBinary.Button1Click(Sender: TObject); 
const 
  CKeyName: string = 'System\Setup'; 
  CValName: string = 'NetcardDlls'; 
var 
  keyGood: boolean; 
  p: integer; 
  regKey: TRegistry; 
  tmpStr: string; 
  vSize: integer; 
begin 
  regKey := TRegistry.Create; 
  try 
    regKey.RootKey := HKEY_LOCAL_MACHINE; 
    keyGood  := regKey.OpenKey(CKeyName, False); 

    if (keyGood) then 
    begin 
      vSize := regKey.GetDataSize(CValName); 

      if (vSize > 0) then 
      begin 
        SetLength(tmpStr, vSize); 
        regKey.ReadBinaryData(CValName, tmpstr[1], vSize); 

        repeat 
          p := Pos(#0, tmpStr); 

          if p <> 0 then 
          begin 
            Delete(tmpStr, p, 1); 
            Insert(#13#10, tmpStr, p); 
          end; 
        until p = 0; 

        (*StringReplace(tmpStr, #0, #13#10, [rfReplaceAll]); *) 

        ListBox1.Items.Text := tmpStr; 
      end; 
    end; 
  finally 
    regKey.Free; 
  end; 
end; 



Код
{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; 



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0489 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.