Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:

Error. Page cannot be displayed. Please contact your service provider for more details. (20)


Как читать REG_MULTI_SZ значение?

Поиск:
Код
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;






Просмотров: 3443

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную