亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? unitexregistry.pas

?? 操作遠程注冊表樣例
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
unit unitEXRegistry;

interface

uses windows, classes, sysutils, registry;

type

TWalkProc = procedure (const keyName, valueName : string; dataType : DWORD; data : pointer; DataLen : Integer) of object;

TSearchParam = (rsKeys, rsValues, rsData);
TSearchParams = set of TSearchParam;

TSearchNode = class
  fValueNames : TStringList;
  fKeyNames : TStringList;
  fCurrentKey : string;
  fPath: string;
  fValueIDX, fKeyIDX : Integer;
  fRegRoot : HKEY;
  constructor Create (ARegRoot : HKEY; const APath : string);
  destructor Destroy; override;

  procedure LoadKeyNames;
  procedure LoadValueNames;
end;

TExRegistry = class (TRegistry)
private
  fSaveServer : string;
  fExportStrings : TStrings;
  fLastExportKey : string;
  fSearchParams : TSearchParams;
  fSearchString : string;
  fSearchStack : TList;
  fMatchWholeString : boolean;
  fCancelSearch : boolean;
  fLocalRoot : HKEY;
  fValuesSize : Integer;
  procedure ExportProc (const keyName, valueName : string; dataType : DWORD; data : pointer; DataLen : Integer);
  procedure ValuesSizeProc (const keyName, valueName : string; dataType : DWORD; data : pointer; DataLen : Integer);
  procedure ClearSearchStack;

public
  destructor Destroy; override;
  procedure SetRoot (root : HKey; const server : string);
  procedure CopyValueFromReg (const valueName : string; otherReg : TExRegistry; deleteSource : boolean);
  procedure CopyKeyFromReg (const keyName : string; otherReg : TExRegistry; deleteSource : boolean);
  function GetValueType (const valueName : string) : DWORD;
  procedure ReadStrings (const valueName : string; strings : TStrings);
  procedure WriteStrings (const valueName : string; strings : TStrings);
  procedure ExportKey (const fileName : string);
  procedure ImportRegFile (const fileName : string);
  procedure WriteTypedBinaryData (const valueName : string; tp : Integer; var data; size : Integer);
  procedure Walk (walkProc : TWalkProc; valuesRequired : boolean);
  function FindFirst (const data : string; params : TSearchParams; MatchWholeString : boolean; var retPath, retValue : string) : boolean;
  function FindNext (var retPath, retValue : string) : boolean;
  procedure CancelSearch;
  property SearchString : string read fSearchString;
  procedure GetValuesSize (var size : Integer);
end;

EExRegistryException = class (ERegistryException)
private
    fCode: Integer;
    function GetError : string;
public
  constructor CreateLastError (const st : string);
  constructor Create (code : DWORD; const st : string);
  property Code : Integer read fCode;
end;

implementation

{ TExRegistry }

resourcestring
  errUnableToConnect = 'Unable to connect to the registry on %s (%d)';

type
  TRootRec = record
    key : HKEY;
    name : string
  end;

const
  NO_ROOT_KEYS = 7;
  RootKeys : array [0..NO_ROOT_KEYS - 1] of TRootRec = (
    (key : HKEY_CLASSES_ROOT;     name : 'HKEY_CLASSES_ROOT'),
    (key : HKEY_CURRENT_USER;     name : 'HKEY_CURRENT_USER'),
    (key : HKEY_LOCAL_MACHINE;    name : 'HKEY_LOCAL_MACHINE'),
    (key : HKEY_USERS;            name : 'HKEY_USERS'),
    (key : HKEY_PERFORMANCE_DATA; name : 'HKEY_PERFORMANCE_DATA'),
    (key : HKEY_CURRENT_CONFIG;   name : 'HKEY_CURRENT_CONFIG'),
    (key : HKEY_DYN_DATA;         name : 'HKEY_DYN_DATA'));


function RootKeyName (key : HKEY) : string;
var
  i : Integer;
begin
  result := '';
  for i := 0 to NO_ROOT_KEYS - 1 do
    if RootKeys [i].key = key then
    begin
      result := RootKeys [i].name;
      break
    end
end;

function RootKeyVal (const st : string) : HKEY;
var
  i : Integer;
begin
  result := $ffffffff;
  for i := 0 to NO_ROOT_KEYS - 1 do
    if RootKeys [i].name = st then
    begin
      result := RootKeys [i].key;
      break
    end
end;


procedure TExRegistry.CancelSearch;
begin
  fCancelSearch := True;
end;

procedure TExRegistry.ClearSearchStack;
var
  i : Integer;
begin
  if Assigned (fSearchStack) then
  begin
    for i := 0 to fSearchStack.Count - 1 do
      TSearchNode (fSearchStack [i]).Free;
    fSearchStack.Free;
    fSearchStack := Nil
  end
end;

procedure TExRegistry.CopyKeyFromReg(const keyName: string;
  otherReg: TExRegistry; deleteSource : boolean);
var
  i : Integer;
  values : TStringList;
  sourceReg : TExRegistry;
  destReg : TExRegistry;
begin
  sourceReg := TExRegistry.Create;
  destReg := TExRegistry.Create;
  values := TStringList.Create;
  try
    sourceReg.RootKey := otherReg.CurrentKey;
    if deleteSource then
      sourceReg.OpenKey (keyName, False)
    else
      sourceReg.OpenKeyReadOnly (keyName);
    sourceReg.GetValueNames (values);

    destReg.RootKey := CurrentKey;
    if destReg.OpenKey (keyName, True) then
    begin
      for i := 0 to values.Count - 1 do
        destReg.CopyValueFromReg (values [i], sourceReg, deleteSource);

      sourceReg.GetKeyNames (values);
      for i := 0 to values.Count - 1 do
        destReg.CopyKeyFromReg (values [i], sourceReg, deleteSource);

      if DeleteSource then
        if not otherReg.DeleteKey (keyName) then
          Raise ERegistryException.Create ('Unable to delete moved key')
    end
    else
      raise ERegistryException.Create ('Unable to open destination');
  finally
    values.Free;
    destReg.Free;
    sourceReg.Free
  end
end;

procedure TExRegistry.CopyValueFromReg(const valueName: string;
  otherReg: TExRegistry; deleteSource : boolean);
var
  buffer : PByte;
  BufSize : DWORD;
  DataType : DWORD;
begin
  BufSize := 65536;
  GetMem (buffer, BufSize);
  try
    DataType := REG_NONE;

    SetLastError (RegQueryValueEx(otherReg.CurrentKey, PChar(valueName), nil, @DataType, Buffer,
      @BufSize));

     if GetLastError <> ERROR_SUCCESS then
      raise EExRegistryException.CreateLastError ('Unable to copy value');

    SetLastError (RegSetValueEx (CurrentKey, PChar (valueName), 0, DataType, buffer, BufSize));
    if GetLastError <> ERROR_SUCCESS then
      raise EExRegistryException.CreateLastError ('Unable to copy value');

    if deleteSource then
      if not otherReg.DeleteValue (valueName) then
        raise ERegistryException.Create ('Unable to delete moved value')
  finally
    FreeMem (buffer)
  end
end;


destructor TExRegistry.Destroy;
begin
  ClearSearchStack;
  inherited Destroy
end;

procedure TExRegistry.ExportKey(const fileName: string);
begin
  fExportStrings := TStringList.Create;
  fExportStrings.Add ('REGEDIT4');
  try
    fLastExportKey := '';
    Walk (ExportProc, True);
    fExportStrings.Add ('');
  finally
    fExportStrings.SaveToFile (fileName);
    fExportStrings.Free;
  end
end;

procedure TExRegistry.ExportProc(const keyName, valueName: string;
  dataType: DWORD; data: pointer; DataLen: Integer);

var
  st : string;
  st1 : string;
  j : Integer;
  localRoot : HKey;

  function MakeCStringConst (s : string) : string;
  var
    i : Integer;
  begin
    result := '';
    for i := 1 to Length (s) do
    begin
      if s [i] in ['\', '"'] then
        result := result + '\';
      result := result + s [i]
    end
  end;

begin
  localRoot := fLocalRoot;
  if localRoot = 0 then
    localRoot := RootKey;

  if fLastExportKey <> keyName then
  begin
    fExportStrings.Add ('');
    fExportStrings.Add (Format ('[%s\%s]', [rootKeyName (localRoot), keyName]));

    fLastExportKey := keyName;
  end;

  if dataLen <> 0 then
  begin
    if valueName = '' then
      st := '@='
    else
      st := Format ('"%s"=', [MakeCStringConst (valueName)]);

    case dataType of
      REG_DWORD :
      begin
        st1 := LowerCase (Format ('%8.8x', [PDWORD (data)^]));
        st := st + format ('dword:%s', [st1])
      end;

      REG_SZ    :
        begin
          PChar (data) [dataLen] := #0;
          st := st + format ('"%s"', [MakeCStringConst (PChar (data))]);
        end;

      else
      begin
        if dataType = REG_BINARY then
          st := st + 'hex:'
        else
          st := st + format ('hex(%d):', [dataType]);
        for j := 0 to dataLen - 1 do
        begin
          st1 := LowerCase (format ('%02.2x', [Byte (PChar (data) [j])]));
          if j < dataLen - 1 then
            st1 := st1 + ',';

          if Length (st) + Length (st1) >= 77 then
          begin
            fExportStrings.Add (st + st1 + '\');
            st := '  ';
          end
          else
            st := st + st1;
        end
      end
    end;
    fExportStrings.Add (st);
  end
end;

function TExRegistry.FindFirst(const data: string; params: TSearchParams; MatchWholeString : boolean;
  var retPath, retValue: string): boolean;
var
  path, nPath, keyName : string;
  p : Integer;
  n : TSearchNode;
begin
  ClearSearchStack;

  fSearchStack := TList.Create;
  path := currentPath;


  nPath := '';
  repeat
    p := Pos ('\', path);
    if p > 0 then
    begin
      nPath := nPath + '\' + Copy (path, 1, p - 1);
      path := Copy (path, p + 1, MaxInt);
      n := TSearchNode.Create (RootKey, nPath);
      n.LoadKeyNames;
      p := Pos ('\', path);
      if p > 0 then
        keyName := Copy (path, 1, p - 1)
      else
        keyName := path;

      n.fKeyIDX := n.fKeyNames.IndexOf (keyName);

      fSearchStack.Add (n);
    end
  until p = 0;

  n := TSearchNode.Create (RootKey, nPath + '\' + path);
  fSearchStack.Add (n);

  fSearchString := UpperCase (data);
  fSearchParams := params;
  fMatchWholeString := MatchWholeString;
  result := FindNext (retPath, retValue);
end;

function TExRegistry.FindNext(var retPath, retValue: string): boolean;
var
  n : TSearchNode;
  found : boolean;
  k : string;
  msg : TMsg;
begin
  found := False;
  fCancelSearch := False;
  while (not found) and (not fCancelSearch) and (fSearchStack.Count > 0) do
  begin
    while PeekMessage (msg, 0, 0, 0, PM_REMOVE) do
    begin
      TranslateMessage (msg);
      DispatchMessage (msg)
    end;

    n := TSearchNode (fSearchStack [fSearchStack.Count - 1]);
    if rsValues in fSearchParams then
    begin
      n.LoadValueNames;
      with n do
        if fValueIdx < fValueNames.Count then
        repeat
          Inc (fValueIdx);
          if fValueIdx < fValueNames.Count then
          begin
            if fMatchWholeString then
              found := fSearchString = fValueNames [fValueIdx]
            else
              found := Pos (fSearchString, fValueNames [fValueIdx]) > 0
          end
        until fCancelSearch or found or (fValueIdx = fValueNames.Count)
    end;

    if not fCancelSearch and not found then
    begin
      n.LoadKeyNames;
      with n do
        if fKeyIdx < fKeyNames.Count then
        begin
          Inc (fKeyIdx);
          if fKeyIdx < fKeyNames.Count then
          begin

            if rsKeys in fSearchParams then
              if fMatchWholeString then
                found := fSearchString = fKeyNames [fKeyIdx]
              else
                found := Pos (fSearchString, fKeyNames [fKeyIdx]) > 0;

            if not found then
            begin
              if n.fPath = '\' then
                k := '\' + fKeyNames [fKeyIdx]
              else
                k := n.fPath + '\' + fKeyNames [fKeyIdx];

              fSearchStack.Add (TSearchNode.Create (RootKey, k));

              continue
            end
          end
      end
    end;

    if fCancelSearch then
      Break;

    if not found then
    begin
      n.Free;
      fSearchStack.Delete (fSearchStack.Count - 1)
    end
    else
    begin
      retPath := n.fPath;
      if n.fKeyIdx > -1 then
        retPath := retPath + '\' + n.fKeyNames [n.fKeyIdx];

      if rsValues in fSearchParams then
        if (n.fValueIdx > -1) and (n.fValueIdx < n.fValueNames.Count) then
          retValue := n.fValueNames [n.fValueIdx]
        else
          retValue := '';
    end
  end;
  result := found
end;

procedure TExRegistry.GetValuesSize(var size: Integer);
begin
  fValuesSize := 0;
  Walk (ValuesSizeProc, False);
  if fValuesSize = 0 then
    fValuesSize := -1;
  size := fValuesSize
end;

function TExRegistry.GetValueType(const valueName: string): DWORD;
var
  valueType : DWORD;
begin
  SetLastError (RegQueryValueEx (CurrentKey, PChar (valueName), Nil, @valueType, Nil, Nil));
  if GetLastError = ERROR_SUCCESS then
    result := valueType
  else
    raise EExRegistryException.CreateLastError ('Unable to get value type');
end;

procedure TExRegistry.ImportRegFile(const fileName: string);
var
  strings : TStrings;
  st : string;
  i : Integer;

  procedure SyntaxError;
  begin
    raise Exception.CreateFmt ('Syntax error in reg file %s at line %d', [fileName, i])
  end;

  procedure CreateNewKey;
  var
    s : string;
    p : Integer;
    r : HKEY;
  begin
    Delete (st, 1, 1);
    if st [Length (st)] <> ']' then
      SyntaxError;

    Delete (st, Length (st), 1);

    p := pos ('\', st);
    if p = 0 then
      SyntaxError;
    s := Copy (st, 1, p - 1);
    st := Copy (st, p + 1, MaxInt);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲丝袜自拍清纯另类| 视频一区二区三区在线| 欧美综合色免费| 国产一区亚洲一区| 亚洲18影院在线观看| 国产精品入口麻豆原神| 欧美日韩精品一二三区| 97久久超碰国产精品电影| 狠狠色2019综合网| 午夜精品久久久久久不卡8050| 国产日韩精品视频一区| 91精品国产黑色紧身裤美女| 91论坛在线播放| 国产91精品久久久久久久网曝门| 免费高清在线视频一区·| 亚洲综合色自拍一区| 一区视频在线播放| 国产亚洲人成网站| 日韩欧美国产一区二区三区 | 精品一区二区在线播放| 亚洲成人激情自拍| 亚洲综合在线第一页| 国产精品乱码一区二区三区软件 | 亚洲少妇中出一区| 国产精品欧美久久久久一区二区| 欧美精品一区男女天堂| 日韩欧美亚洲一区二区| 91精品国产综合久久精品麻豆| 色欧美乱欧美15图片| 91美女精品福利| 99精品在线观看视频| 99精品欧美一区二区三区小说| 国产精品影音先锋| 国产在线麻豆精品观看| 激情小说欧美图片| 国产成人综合自拍| 成人在线视频首页| 99久久精品国产毛片| 99久久精品免费看国产免费软件| 99久久久免费精品国产一区二区| 成人av网站大全| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 91免费版pro下载短视频| 不卡视频免费播放| 99久精品国产| 色悠悠久久综合| 欧美性大战久久| 91精品在线观看入口| 日韩一区二区三区电影| 精品国产一区二区在线观看| 久久久久久综合| 国产精品免费丝袜| 亚洲精品日日夜夜| 亚洲.国产.中文慕字在线| 五月婷婷激情综合网| 奇米四色…亚洲| 国产在线精品免费| 成人av在线电影| 在线观看一区二区精品视频| 欧美日本在线一区| 欧美电视剧免费观看| 国产三级一区二区| 亚洲另类在线视频| 日韩精品电影在线观看| 韩国v欧美v亚洲v日本v| 成人激情综合网站| 欧美三级欧美一级| 欧美精品一区男女天堂| 国产精品久久久久aaaa| 午夜成人免费视频| 麻豆91在线播放免费| 国产成人免费网站| 欧美性大战久久久久久久蜜臀| 欧美成人三级电影在线| 中文字幕日本不卡| 青草av.久久免费一区| 成人国产精品视频| 欧美年轻男男videosbes| 国产午夜精品久久久久久免费视 | 欧美人牲a欧美精品| www久久久久| 亚洲综合在线视频| 国产激情视频一区二区在线观看 | 粉嫩一区二区三区在线看| 欧美影片第一页| 久久久久99精品一区| 亚洲影视在线播放| 国产不卡一区视频| 欧美一区二区三区日韩| 国产精品久久久久精k8| 美女爽到高潮91| 91麻豆自制传媒国产之光| 日韩欧美第一区| 一区二区三区在线视频观看58| 美女视频网站黄色亚洲| 91福利国产精品| 欧美激情综合网| 六月丁香婷婷久久| 欧美私模裸体表演在线观看| 欧美极品另类videosde| 毛片不卡一区二区| 欧美美女直播网站| 一区二区三区四区在线免费观看| 国产精品中文字幕日韩精品| 欧美福利一区二区| 亚洲综合免费观看高清完整版在线| 国产精品911| ww久久中文字幕| 麻豆91免费观看| 欧美日产在线观看| 亚洲一区在线观看免费观看电影高清 | 亚洲一区二区高清| 91亚洲精品久久久蜜桃网站| 久久久久综合网| 国产在线精品不卡| 精品欧美一区二区三区精品久久| 亚洲成av人片在线| 欧美三级中文字幕| 亚洲伊人色欲综合网| 色婷婷av一区二区三区大白胸| 国产精品剧情在线亚洲| 国产a级毛片一区| 久久嫩草精品久久久久| 极品少妇xxxx精品少妇偷拍| 日韩欧美一二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美日韩一级视频| 亚洲成av人片一区二区| 欧美日韩国产美| 丝袜美腿亚洲综合| 正在播放亚洲一区| 免费在线观看一区二区三区| 日韩一区二区三免费高清| 免费在线观看日韩欧美| 日韩视频免费观看高清完整版 | 日韩成人av影视| 欧美一区二区三区色| 久久99精品久久久久| 26uuu另类欧美亚洲曰本| 精品系列免费在线观看| 久久精品男人天堂av| 成人免费视频一区| 亚洲欧洲av一区二区三区久久| 99久久精品国产精品久久| 亚洲精品菠萝久久久久久久| 欧美体内she精高潮| 婷婷国产在线综合| 欧美大片一区二区| 国产精品一卡二卡在线观看| 日本一二三不卡| 91浏览器打开| 天天av天天翘天天综合网| 欧美一区二区三区视频免费| 国产在线精品免费| 亚洲欧美中日韩| 欧美日韩国产一区| 久久99久久精品| 国产精品二三区| 欧美欧美欧美欧美| 国产一区欧美一区| 亚洲人成在线播放网站岛国 | 欧美性大战久久久| 美女国产一区二区| 国产精品色哟哟| 欧美日韩国产天堂| 国产盗摄女厕一区二区三区| 亚洲欧美日韩人成在线播放| 91精品国产一区二区人妖| 国产一区二区伦理| 亚洲欧美区自拍先锋| 91精品国产福利在线观看| 国产精品资源在线看| 一区二区三区在线视频播放| 欧美成人伊人久久综合网| eeuss鲁片一区二区三区在线看| 亚洲国产综合色| 久久婷婷色综合| 欧美日韩情趣电影| 国产成人激情av| 偷拍与自拍一区| 国产精品视频麻豆| 日韩网站在线看片你懂的| 91视频你懂的| 国产综合成人久久大片91| 亚洲一区二区三区影院| 国产婷婷色一区二区三区四区| 欧美性生活一区| 韩国一区二区三区| 亚洲综合在线视频| 中文字幕欧美国产| 日韩一区二区高清| 在线观看精品一区| 岛国精品在线观看| 精品一区二区三区免费观看| 亚洲最新视频在线观看| 中文字幕av一区二区三区高| 欧美一级视频精品观看| 在线观看国产日韩| www..com久久爱| 国产成人免费9x9x人网站视频|