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

Вниз

Как прочитать "мультистроковый параметр" с регистра.   Найти похожие ветки 

 
slaga ©   (2006-07-07 18:43) [0]

Добрый день, вопрос собственно: Как прочитать "мультистроковый параметр" с регистра.

Тоесть TMP := Reg.ReadString("Tools") не подходит,

ругается "Invalid data type for "Tools".

Как правильно ?


 
slaga ©   (2006-07-07 18:56) [1]

сделал вот так, но незнаю как получить дальше строки из буфера

var Reg: TRegistry;
    XMLstring: TStrings;
    Size: integer;
    Buffer: Pointer;
begin
  Reg := TRegistry.Create;
  try
   Reg.RootKey := HKEY_LOCAL_MACHINE;
   if Reg.OpenKey("SOFTWARE\Welcash\ScanerFrnt\Tools", False) then
    Reg.ReadBinaryData("Tools.xml", Buffer, Reg.GetDataSize("Tools.xml"));


 
PSPF2003 ©   (2006-07-07 19:31) [2]

Если я правильно понял мультистроковый это StringList?
Есть примерчик который показывает список введенных адресов в IE

private
 ValueNames : TStrings;

procedure LoadValues;
var
 Reg : TRegistry;
 Index  : Integer;
begin
 Reg  := TRegistry.Create;
 try
 if Reg.OpenKey("\SOFTWARE\Microsoft\Internet Explorer\TypedURLs", FALSE) then
   begin
    Reg.GetValueNames(ValueNames);
     for Index := 0 to ValueNames.Count -1 do
     begin
   CurrentList.Items.Add(Reg.ReadString(ValueNames.Strings[Index]));
     end;
   end
   else
   begin
  MessageDlg("Windows registry error, continue not possible", mtError, [mbOK], 0);
     OkButton.Enabled := FALSE;
   end;
 finally
   Reg.Free;
 end;
end

Могу дать весь пример.


 
Gero ©   (2006-07-07 19:34) [3]

procedure TGrRegistry.ReadMultiString(const Name: string; List: TStrings);
var
 BufSize: DWORD;
 DataType: TGrRegDataType;
 i: Integer;
 Buffer: PChar;
 S: string;
begin
 BufSize := GetDataSize(Name);
 if BufSize < 1 then Exit;
 Buffer := AllocMem(BufSize);
  try
    if Buffer = nil then Exit;
    DataType := REG_NONE;
    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]);
    List.Clear;
    S := "";
    for i := 0 to BufSize - 2 do
      begin
        if Buffer[i] = #0 then
          begin
            List.Add(S);
            S := "";
          end { if }
        else
          S := S + Buffer[i];
    end; { for }
  finally
    FreeMem(Buffer);
  end; { try..finally }
end;


 
Gero ©   (2006-07-07 19:35) [4]

Да, TGrRegistry = class(TRegistry)


 
slaga ©   (2006-07-10 10:31) [5]

Спасибо за помощь но:

to PSPF2003: мне не надо получить значения всех ключей в одной папке,
мне нужно получить значения одного ключа который содержит набор строк.

to Gero: возможно я что-то не то делаю, но у меня все строки выдаются как Buffer[i] = #0.

Что можите посоветовать еще ?


 
Чапаев ©   (2006-07-10 13:30) [6]

unit RegistryEx;

interface

uses
 Registry,
 Classes;

type
 TRegDataTypeEx = (rdUnknown, rdString, rdExpandString, rdInteger, rdBinary, rdMultiString);

 TRegistryEx=class(TRegistry)
 protected
   function GetDataEx(const Name: string; Buffer: Pointer;
     BufSize: Integer; var RegData: TRegDataTypeEx): Integer;
   procedure PutDataEx(const Name: string; Buffer: Pointer;
     BufSize: Integer; RegData: TRegDataTypeEx);
 public
   function ReadMultiString(const Name:string):string;overload;
   procedure ReadMultiString(const Name:string; const Result:TStrings);overload;
   procedure WriteMultiString(const Name,Value:string);overload;
   procedure WriteMultiString(const Name:string; const Value:TStrings);overload;
 end;

implementation

uses
 Windows,
 RtlConsts,
 SysUtils;

procedure ReadError(const Name: string);
begin
 raise ERegistryException.CreateResFmt(@SInvalidRegType, [Name]);
end;

function DataTypeToRegDataEx(Value: Integer): TRegDataTypeEx;
begin
 if Value = REG_SZ then Result := rdString
 else if Value = REG_EXPAND_SZ then Result := rdExpandString
 else if Value = REG_DWORD then Result := rdInteger
 else if Value = REG_BINARY then Result := rdBinary
 else if Value = REG_MULTI_SZ then Result:=rdMultiString      
 else Result := rdUnknown;
end;

function RegDataToDataTypeEx(Value: TRegDataTypeEx): Integer;
begin
 case Value of
   rdString: Result := REG_SZ;
   rdExpandString: Result := REG_EXPAND_SZ;
   rdInteger: Result := REG_DWORD;
   rdBinary: Result := REG_BINARY;
   rdMultiString: Result:=REG_MULTI_SZ;
 else
   Result := REG_NONE;
 end;
end;

{ TRegistryEx }

function TRegistryEx.ReadMultiString(const Name: string): string;
var
 Len,I: Integer;
 RegData: TRegDataTypeEx;
 Buf:PChar;
begin
 Len := GetDataSize(Name);
 if Len > 0 then
 begin
   Buf:=StrAlloc(Len);
   GetDataEx(Name, Buf, Len, RegData);
   for I := 0 to Len-2 do
     if Buf[I]=#0
       then Result:=Result+#13#10
       else Result:=Result+Buf[I];
   StrDispose(Buf);      
 end
 else Result := "";
end;

procedure TRegistryEx.WriteMultiString(const Name, Value: string);
var
 S:TStringList;
begin
 S:=TStringList.Create;
 S.Text:=Value;
 WriteMultiString(Name,S);
 S.Free;
end;

function TRegistryEx.GetDataEx(const Name: string; Buffer: Pointer;
 BufSize: Integer; var RegData: TRegDataTypeEx): Integer;
var
 DataType: Integer;
begin
 DataType := REG_NONE;
 if RegQueryValueEx(CurrentKey, PChar(Name), nil, @DataType, PByte(Buffer),
   @BufSize) <> ERROR_SUCCESS then
   raise ERegistryException.CreateResFmt(@SRegGetDataFailed, [Name]);
 Result := BufSize;
 RegData := DataTypeToRegDataEx(DataType);
end;

procedure TRegistryEx.PutDataEx(const Name: string; Buffer: Pointer;
 BufSize: Integer; RegData: TRegDataTypeEx);
var
 DataType: Integer;
begin
 DataType := RegDataToDataTypeEx(RegData);
 if RegSetValueEx(CurrentKey, PChar(Name), 0, DataType, Buffer,
   BufSize) <> ERROR_SUCCESS then
   raise ERegistryException.CreateResFmt(@SRegSetDataFailed, [Name]);
end;

procedure TRegistryEx.ReadMultiString(const Name: string;
 const Result: TStrings);
begin
 Result.Text:=ReadMultiString(Name);
end;

procedure TRegistryEx.WriteMultiString(const Name: string;
 const Value: TStrings);
var
 Buf:PChar;
 Len,CurLen,L,I:Integer;
begin
 Len:=1;
 for I := 0 to Value.Count - 1 do
   Len:=Len+Length(Value[I])+1;
 Buf:=StrAlloc(Len);
 FillChar(Buf[0],Len,0);
 CurLen:=0;
 for I := 0 to Value.Count - 1 do begin
   L:=Length(Value[I]);
   Move(Value[I][1],Buf[CurLen],L);
   CurLen:=CurLen+L+1;
 end;
 PutDataEx(Name,@Buf[0],Len,rdMultiString);
 StrDispose(Buf);
end;

end.



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

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

Наверх





Память: 0.48 MB
Время: 0.039 c
1-1152080166
ancot
2006-07-05 10:16
2006.08.20
Цвет TMainMenu


1-1152527073
Calibr
2006-07-10 14:24
2006.08.20
Сообщения чужого окна


3-1150200676
bon
2006-06-13 16:11
2006.08.20
id @ parent


15-1153604106
Германн
2006-07-23 01:35
2006.08.20
Скушно!


15-1153430789
Батя
2006-07-21 01:26
2006.08.20
Слова Благодарности





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