<li id="j64py"><acronym id="j64py"></acronym></li>

  • <em id="j64py"></em>

    <em id="j64py"><acronym id="j64py"></acronym></em>
    <dd id="j64py"></dd>
    <em id="j64py"><acronym id="j64py"><input id="j64py"></input></acronym></em>
    <rp id="j64py"><object id="j64py"><blockquote id="j64py"></blockquote></object></rp>
    <button id="j64py"><acronym id="j64py"></acronym></button>
    捐助郴維網
    感謝您對郴維網的支持,你的支持將是郴維網持續發展的動力!
    二維碼
    ×
    當前位置:郴維網 >基礎知識 > 正文
    16 2021.03

    delphi 操作注冊表

    點擊次數:778 更新時間:2021-3-16 15:14:46  【打印此頁

    對注冊表的操作,Delphi提供了TRegistry類,它直接繼承自TObject類。

     

    引用單元:

    uses
      Registry;
    

     

    屬性:

      RootKey屬性

        指定當前操作的注冊表主鍵 有如下5種:

        HKEY_CLASSES_ROOT

        HKEY_CURRENT_USER (默認)

        HKEY_LOCAL_MACHINE

        HKEY_USERS

        HKEY_CURRENT_CONFIG

     

    方法:

        注:有些方法需要程序具有一定的權限才能使用;比如:LoadKey()方法 需要設置 'SeRestorePrivilege' 權限、SaveKey()方法 需要設置'SeBackupPrivilege'權限。具體使用參考LoadKey()方法的示例代碼。

     

      CreateKey方法

      function CreateKey(const Key: String):Boolean;
      {
      功能:
        創建注冊表項
        
      參數:
        Key		指定要創建的注冊表的項
          
      返回值:
        創建成功返回True,失敗返回False。出現錯誤時,將引發異常。
      
      注:Key可以是絕對名稱或相對名稱。絕對名稱以反斜杠(\)開頭,是根的子項。相對名稱是當前項的子項。
      }
    

      Destroy方法

      destructor Destroy; override;
      {
      功能:
        關閉當前項并銷毀TRegistry對象,一般直接調用對象的Free。
      }
    

      OpenKey方法

      function OpenKey(const Key: String; CanCreate: Boolean):Boolean;
      {
      功能:
        打開注冊表項
        
      參數:
        Key		指定要打開的注冊表的項
        CanCreate	指明當要打開的項不存在時是否創建,默認值為False
          
      返回值:
        如果打開成功返回True,否則返回False。
      }
    

      OpenKeyReadOnly方法

      function OpenKeyReadOnly(const Key: String): Boolean;
      {
      功能:
        以只讀方式打開注冊表項
        
      參數:
        Key		指定要打開的注冊表的項
          
      返回值:
        如果打開成功返回True,否則返回False。
      }
    

      CloseKey方法

      procedure CloseKey;
      {
      功能:
        將當前項寫入注冊表并關閉該項
      }
    

      DeleteKey方法

      function DeleteKey(const Key: string): Boolean;
      {
      功能:
        刪除注冊表項
        
      參數:
        Key		指定要刪除的注冊表的項
          
      返回值:
        刪除成功返回True。出現錯誤時,返回False。
      
      注:刪除一個項及相關聯的數據,在win95中子項也將被刪除,NT中子項必須一個個刪除。
      }
    

      DeleteValue方法

      function DeleteValue(const Name: string): Boolean;
      {
      功能:
        刪除注冊表數據值
        
      參數:
        Name	指定要刪除的數據值
          
      返回值:
        刪除成功返回True;刪除失敗返回False
      }
    

      GetDataSize方法

      function GetDataSize(const ValueName: string): Integer;
      {
      功能:
        返回與當前項關聯的指定數據值的大?。ㄗ止潱?
        
      參數:
        ValueName	指定要查詢的數據值
          
      返回值:
        成功返回數據值的大??;失敗返回-1。
      
      注意:如果數據值是字符串,GetDataSize將返回數據值的大小,并為終止的空字符返回一個額外字節。
      }
    

      GetDataType方法

      function GetDataType(const ValueName: string): TRegDataType;
      {
      功能:
        返回當前項中一個指定數值ValueName數據的類型
        
      參數:
        ValueName	指定要查詢的數據值
          
      返回值:
        ValueName數據的類型
      }
    

      GetKeyInfo方法

      function GetKeyInfo(var Value: TRegKeyInfo): Boolean;
      {
      功能:
        返回當前項的信息,信息是一個TRegKeyInfo結構,具體如下:
        TRegKeyInfo = record
          NumSubKeys: Integer; // 子項數量
          MaxSubKeyLen: Integer; // 子項名的最長值(字節)
          NumValues: Integer;  // 數據值的數量
          MaxValueLen: Integer; // 最長的項值名的長度
          MaxDataLen: Integer;  // 數據值的最大長度
          FileTime: TFileTime; // 最后一次更改的時間
        end;
        
      參數:
        Value	TRegKeyInfo結構對象
          
      返回值:
        成功回True;失敗返回False,值記錄設置為零。
      }
    

      GetKeyNames方法

      procedure GetKeyNames(Strings: TStrings);
      {
      功能:
        返回包含屬于當前項的所有子項的名稱的字符串列表
        
      參數:
        Strings	字符串列表
          
      返回值:
        Strings是TStrings類型的變量,用于返回子項名稱列表。
      }
    

      GetValueNames方法

      procedure GetValueNames(Strings: TStrings);
      {
      功能:
        返回包含與當前項關聯的所有數據值的名稱的字符串列表
        
      參數:
        Strings	字符串列表
          
      返回值:
        Strings是TStrings類型的變量,用于返回數據值名稱列表。
      }
    

      HasSubKeys方法

      function HasSubKeys: Boolean;
      {
      功能:
        確定當前項是否有子項
          
      返回值:
        如果當前項至少有一個子項,則返回True。否則返回False
      }
    

      KeyExists方法

      function KeyExists(const Key: string): Boolean;
      {
      功能:
        確定指定名稱的項是否存在。
        
      參數:
        Key		要搜索的項的名稱
          
      返回值:
        存在返回True。否則返回False
      }
    

      ValueExists方法

      function ValueExists(const Name: string): Boolean;
      {
      功能:
        確定當前項是否存在指定的數據值。
        
      參數:
        Name 	要檢查的數據值的名稱
          
      返回值:
        存在返回True。否則返回False
      }
    

      LoadKey方法

      // 需要設置程序權限為'SeRestorePrivilege'權限。 具體使用參考LoadKey()方法的示例代碼。
      function LoadKey(const Key, FileName: string): Boolean;
      {
      功能:
        在根項下創建子項,并將注冊表信息從文件加載到新創建的子項中。
        
      參數:
       Key		要創建子項的名稱
       FileName	文件的位置,所指定的文件必須為以前用SaveKey函數或RegSaveKey API函數所建立的,文件名不能包括擴展名。
          
      返回值:
        創建成功返回True。否則返回False
      }
    

      UnLoadKey方法

      function UnLoadKey(const Key: string): Boolean;
      {
      功能:
        移除使用LoadKey方法在根項下創建子項。
        
      參數:
       Key		要移除子項的名稱
          
      返回值:
        創建成功返回True。否則返回False
      }
    

      SaveKey方法

      // 需要設置程序權限為'SeBackupPrivilege'權限。 具體使用參考LoadKey()方法的示例代碼。
      function SaveKey(const Key, FileName: string): Boolean;
      {
      功能:
        將一個打開的項(包括所有子項和內容)保存為注冊表信息文件。(需要指定安全訪問值為 KEY_ALL_ACCESS )
        
      參數:
       Key		要保存的項
       FileName	保存文件的位置
          
      返回值:
        創建成功返回True。否則返回False
      }
    

      MoveKey方法

      procedure MoveKey(const OldName, NewName: string; Delete: Boolean);
      {
      功能:
        將現有項及其子項和數據值移動到新位置。
        
      參數:
        OldName	要復制或移動的項
        NewName	新位置項的名稱
        Delete	是否刪除舊項
      }
    

      RegistryConnect方法

      function RegistryConnect(const UNCName: string): Boolean;
      {
      功能:
        建立與另一臺計算機上注冊表的連接。
        
      參數:
        UNCName	遠程計算機的名稱 (格式:\\計算機名)
        
      返回值:
        連接成功,將RootKey屬性設置為遠程計算機的根項并返回True。如果不成功返回False,RootKey保持不變。
        
      注意:在調用RegistryConnect之前,應用程序必須將其注冊表對象的RootKey屬性設置為HKEY_USERS或HKEY_LOCAL_MACHINE。
      }
    

     

      Read系列方法

    function ReadCurrency(const Name: string): Currency; 
    {
    貨幣值
    
    參數:
      Name 要讀取的數據值的名稱。
    
    返回值:
      如果成功,將返回一個貨幣值。如果注冊表項不包含貨幣值,則會引發異常。
    }
    
    function ReadBinaryData(const Name: string; var Buffer; BufSize: Integer): Integer; 
    {
    二進制值
    
    參數:
      Name 要讀取的數據值的名稱。
      Buffer 是用來存儲讀取到的數據的緩沖區。緩沖區必須足夠大,以容納返回的所有數據。
      BufSize 指定緩沖區的大小。
    
    返回值:
      如果成功,ReadBinaryData將請求的數據寫入緩沖區并返回寫入的字節數。如果注冊表項包含已知類型(例如字符串),ReadBinaryData將引發異常。
    }
    
    function ReadBool(const Name: string): Boolean;
    {
    布爾值
    
    參數:
      Name 要讀取的數據值的名稱。
    
    返回值:
      如果成功,ReadBool將返回請求的布爾值。如果注冊表項不包含布爾值或整數值,則會引發異常。
    }
    
    function ReadDate(const Name: string): TDateTime;
    {
    日期值
    
    參數:
      Name 要讀取的數據值的名稱。
    
    返回值:
      如果成功,ReadDate返回一個TDateTime值。TDateTime值的組成部分是自1899年12月30日以來已過的天數。TDateTime值的小數部分是一天中的時間。如果注冊表項不包含日期或時間值,則會引發異常。
    
    注意:僅使用ReadDate讀取以前與WriteDate過程一起存儲的數據值。
    }
    
    function ReadDateTime(const Name: string): TDateTime;
    {
    日期時間值
    
    參數:
      Name 要讀取的數據值的名稱。
    
    返回值:
      如果成功,ReadDateTime將返回一個TDateTime值。TDateTime值的組成部分是自1899年12月30日以來已過的天數。TDateTime值的小數部分是一天中的時間。如果注冊表項不包含日期或時間值,則會引發異常。
    }
    
    function ReadFloat(const Name: string): Double;
    {
    浮點值
    
    參數:
      Name 要讀取的數據值的名稱。
    
    返回值:
      如果成功,返回一個浮點值,如果注冊表項不包含浮點值,則會引發異常。
    }
    
    function ReadInteger(const Name: string): Integer;
    {
    整數值
    
    參數:
      Name 要讀取的數據值的名稱。
    
    返回值:
      如果成功,返回一個整數值,如果注冊表項不包含整數,則會引發異常。
    }
    
    function ReadString(const Name: string): string;
    {
    字符串值
    
    參數:
      Name 要讀取的數據值的名稱。
    
    返回值:
      如果沒有具有指定名稱的注冊表項,ReadString將返回空字符串。如果注冊表項包含字符串以外的內容,則會引發異常。
    
    注意:ReadString檢索由WriteString或WriteExpandString方法存儲的數據。
    }
    
    function ReadTime(const Name: string): TDateTime;
    {
    時間值
    
    參數:
      Name 要讀取的數據值的名稱。
    
    返回值:
      如果成功,ReadTime返回一個TDateTime值。TDateTime值的組成部分是自1899年12月30日以來已過的天數。TDateTime值的小數部分是一天中的時間。如果指定的注冊表項不包含日期或時間值,則會引發異常。
    
    注意:僅使用ReadTime讀取以前用WriteTime方法存儲的數據值。
    }
    

     

      Write系列方法

    procedure WriteCurrency(const Name: string; Value: Currency);
    {
    貨幣值
    
    參數:
      Name 要寫入的數據值的名稱
      Value 要寫入的貨幣值
    
    說明:
      如果名稱已存在,則其當前值將被WriteCurrency覆蓋。如果名稱不存在,則創建該名稱。
      如果WriteCurrency失敗,則會引發異常,并且該值不會寫入注冊表。
    }
    
    procedure WriteBinaryData(const Name: string; const Buffer; BufSize: Integer);
    {
    二進制值
    
    參數:
      Name 要寫入的數據值的名稱
      Buffer 數據緩沖區
      BufSize 指定緩沖區的大小
      
    說明:
      如果名稱已存在,則其當前值將被WriteBinary覆蓋。如果名稱不存在,則創建該名稱。
      如果WriteBinaryData失敗,則會引發異常,并且該值不會寫入注冊表。
      
    注意:數據值長度受可用內存的限制。長值(超過2048字節)應作為單獨的文件存儲,這些文件名應存儲在注冊表中。應用程序元素(如圖標、位圖和可執行文件)應存儲為單獨的文件,而不是作為注冊表中的值。
    }
    
    procedure WriteBool(const Name: string; Value: Boolean);
    {
    布爾值
    
    參數:
      Name 要寫入的數據值的名稱
      Value 要寫入的布爾值
      
    說明:
      如果名稱已存在,則其當前值將被WriteBool覆蓋。如果名稱不存在,則創建該名稱。
      如果WriteBool失敗,則會引發異常,并且該值不會寫入注冊表。
    }
    
    procedure WriteDate(const Name: string; Value: TDateTime);
    {
    日期值
    
    參數:
      Name 要寫入的數據值的名稱
      Value 要寫入的日期值
      
    說明:
      如果名稱已存在,則其當前值將被WriteDate覆蓋。如果名稱不存在,則創建該名稱。
      如果WriteDate失敗,則會引發異常,并且該值不會寫入注冊表。
      如果成功,WriteDate將存儲TDateTime值。TDateTime值的組成部分是自1899年12月30日以來已過的天數。TDateTime值的小數部分是一天中的時間。
    }
    
    procedure WriteDateTime(const Name: string; Value: TDateTime);
    {
    日期時間值
    
    參數:
      Name 要寫入的數據值的名稱
      Value 要寫入的日期時間值
      
    說明:
      如果名稱已存在,則其當前值將被WriteDateTime覆蓋。如果名稱不存在,則創建該名稱。
      如果WriteDateTime失敗,則會引發異常,并且該值不會寫入注冊表。
      如果成功,WriteDateTime將存儲TDateTime值。TDateTime值的組成部分是自1899年12月30日以來已過的天數。TDateTime值的小數部分是一天中的時間。
    }
    
    procedure WriteFloat(const Name: string; Value: Double);
    {
    浮點值
    
    參數:
      Name 要寫入的數據值的名稱
      Value 要寫入的浮點值
      
    說明:
      如果名稱已存在,則其當前值將被WriteFloat覆蓋。如果名稱不存在,則創建該名稱。
      如果WriteFloat失敗,則會引發異常,并且該值不會寫入注冊表。
    }
    
    procedure WriteInteger(const Name: string; Value: Integer);
    {
    整數值
    
    參數:
      Name 要寫入的數據值的名稱
      Value 要寫入的整數值
      
    說明:
      如果名稱已存在,則其當前值將被WriteInteger覆蓋。如果名稱不存在,則創建該名稱。
      如果WriteInteger失敗,則會引發異常,并且該值不會寫入注冊表。
    }
    
    procedure WriteString(const Name, Value: string);
    {
    字符串值
    
    參數:
      Name 要寫入的數據值的名稱
      Value 要寫入的字符串值
      
    說明:
      如果名稱已存在,則其當前值將被WriteString覆蓋。如果名稱不存在,則創建該名稱。
      如果WriteString失敗,將引發異常,并且該值不會寫入注冊表。
    }
    
    procedure WriteExpandString(const Name, Value: string);
    {
    擴展字符串值 
      該字符串包含對環境變量(如"%PATH%")的未展開引用
    
    參數:
      Name 要寫入的數據值的名稱
      Value 要寫入的擴展字符串值
      
    說明:
      如果名稱已存在,則其當前值將被WriteExpandString覆蓋。如果名稱不存在,則創建該名稱。
      如果WriteExpandString失敗,則會引發異常。
    
    注意:若要寫入不包含未展開的環境變量的字符串,請改用WriteString
    }
    
    procedure WriteTime(const Name: string; Value: TDateTime);
    {
    時間值
    
    參數:
      Name 要寫入的數據值的名稱
      Value 要寫入的時間值
      
    說明:
      如果名稱已存在,則其當前值將被WriteTime覆蓋。如果名稱不存在,則創建該名稱。
      如果WriteTime失敗,則會引發異常,并且該值不會寫入注冊表。
      如果成功,WriteTime將存儲一個TDateTime值。TDateTime值的組成部分是自1899年12月30日以來已過的天數。TDateTime值的小數部分是一天中的時間。
    }
    

     

    使用示例:

     

    更多示例:

      取消注冊表重定向功能操作64位注冊表項

      32位程序在64位系統下讀寫注冊表時操作HKEY_LOCAL_MACHINE主項下的部份項時,會重定向至32位的注冊表項SOFTWARE\Wow6432Node。

      注:網上有說使用Wow64DisableWow64FsRedirection關閉文件重定向功能實現,經測試無效。

    {
      如果你的程序是32位的,你會發現代碼運行完后,在HKEY_LOCAL_MACHINE\SOFTWARE下沒有建立test項。
      實行上它將test寫入了32位的注冊表項中 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
    }
    procedure TForm1.btn1Click(Sender: TObject);
    var
      reg: TRegistry;
    begin
      reg := TRegistry.Create;
      reg.RootKey := HKEY_LOCAL_MACHINE;
      try
        if reg.OpenKey('SOFTWARE\test', True) then // True 表示test項不存在則創建
        begin
          reg.WriteString('test', 'test123');
    
          reg.CloseKey;
        end;
      finally
        reg.Free;
      end;
    end;
    
    {
      解決辦法一( >=Delphi2010 ):
      構造時加 KEY_WOW64_64KEY
    
    }
    procedure TForm1.btn2Click(Sender: TObject);
    var
      reg: TRegistry;
    begin
      reg := TRegistry.Create(KEY_ALL_ACCESS or KEY_WOW64_64KEY);
      // 加 KEY_WOW64_64KEY
      reg.RootKey := HKEY_LOCAL_MACHINE;
      try
        if reg.OpenKey('SOFTWARE\test', True) then // True 表示test項不存在則創建
        begin
          reg.WriteString('test', 'test123');
    
          reg.CloseKey;
        end;
      finally
        reg.Free;
      end;
    end;
    
    {
      解決辦法二:
      在老版本的delphi中并沒有 KEY_WOW64_64KEY ,需自定義 KEY_WOW64_64KEY = $0100;
    }
    procedure TForm1.btn3Click(Sender: TObject);
    const
      KEY_WOW64_64KEY = $0100;
    var
      reg: TRegistry;
    begin
      reg := TRegistry.Create(KEY_ALL_ACCESS or KEY_WOW64_64KEY);
      reg.RootKey := HKEY_LOCAL_MACHINE;
      try
        if reg.OpenKey('SOFTWARE\test', True) then // True 表示test項不存在則創建
        begin
          reg.WriteString('test', 'test123');
    
          reg.CloseKey;
        end;
      finally
        reg.Free;
      end;
    end;
    

     

      同時操作多個項

    procedure TForm1.btn4Click(Sender: TObject);
    var
      reg: TRegistry;
    begin
      reg := TRegistry.Create;
      try
        reg.RootKey := HKEY_LOCAL_MACHINE;
        if reg.OpenKeyReadOnly('SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName') then
        begin
          ShowMessage(reg.ReadString('ComputerName'));
    
          reg.CloseKey;
        end;
    
        reg.RootKey := HKEY_CURRENT_USER; // 如果是同一個 根項 則不用重復指定
        if reg.OpenKeyReadOnly('Software\Microsoft\Windows\CurrentVersion\Run') then
        begin
          ShowMessage(reg.ReadString('ctfmon'));
    
          reg.CloseKey;
        end;
      finally
        reg.Free;
      end;
    end;
    

     

      讀寫二進制數據

    // 引入 StrUtils
    
    // 寫入
    procedure TForm1.btn5Click(Sender: TObject);
    var
      mStr: string; // 二進制數據字符串
      mBuf: array of byte; // 二進制字節流
      mCount, i: integer;
      reg: TRegistry;
    begin
      // 通過二進制字符串構造出二進制字節流 (如果有現在的二進制字節流則可以直接使用)
      mStr := 'bf,31,36,30,98,14,02,92,61,41,ae,ac,c3,a9,b2,9a,19,96,a8,1c,e3';
      mStr := mStr + ','; // 最后必須以 , 結束
    
      mCount := (Length(mStr) div 3);
      SetLength(mBuf, mCount);
      for i := 0 to mCount - 1 do
      begin
        mBuf[i] := StrToInt('$' + LeftBStr(mStr, 2));
        Delete(mStr, 1, 3);
      end;
    
      reg := TRegistry.Create(KEY_ALL_ACCESS or KEY_WOW64_64KEY);  // 取消重定向
      reg.RootKey := HKEY_LOCAL_MACHINE;
      try
        if reg.OpenKey('SOFTWARE\test', True) then  // True 表示test項不存在則創建
        begin
          reg.WriteBinaryData('key', mBuf[0], mCount);
    
          reg.CloseKey;
        end;
      finally
        reg.Free;
      end;
    end;
    
    // 讀取
    procedure TForm1.btn6Click(Sender: TObject);
    var
      mBuf: array of byte; // 二進制字節流
      mCount: integer;
      reg: TRegistry;
    begin
      reg := TRegistry.Create(KEY_ALL_ACCESS or KEY_WOW64_64KEY);  // 取消重定向
      reg.RootKey := HKEY_LOCAL_MACHINE;
      try
        if reg.OpenKey('SOFTWARE\test', True) then  // True 表示test項不存在則創建
        begin
          mCount := reg.GetDataSize('key'); // 通過GetDataSize函數獲取數據值的大小(字節)
          if mCount <> -1 then
          begin
            SetLength(mBuf, mCount);
            reg.ReadBinaryData('key', mBuf[0], mCount);
          end;
          reg.CloseKey;
        end;
      finally
        reg.Free;
      end;
    end;
    

     

      獲取根項下所有子項的名稱的字符串列表

      目的:

      1,了解如何打開根項進行操作

      2,怎么使用GetKeyNames返回包含屬于當前項的所有子項的名稱的字符串列表

    procedure TForm1.btn7Click(Sender: TObject);
    var
      reg: TRegistry;
      strList: TStringList;
    begin
      strList := TStringList.Create; // 初始化strList;
    
      reg := TRegistry.Create(KEY_ALL_ACCESS or KEY_WOW64_64KEY);  // 取消重定向
      reg.RootKey := HKEY_LOCAL_MACHINE;
      try
        if reg.OpenKeyReadOnly('\') then  // 打開根項可用 '\' 或 ''
        begin
          reg.GetKeyNames(strList); // 獲取當前項下所有子項的名稱的字符串列表存入strList中
          reg.CloseKey;
        end;
      finally
        reg.Free;
      end;
    end;
    

     

     讀取和寫入類型REG_MULTI_SZ的注冊表項

      1,在項目中添加 uRegistryHelper.pas 代碼如下:

    unit uRegistryHelper;
    
    interface
    
    uses
      System.Classes, System.Win.Registry, Winapi.Windows, System.Math;
    
    type
      TRegistryHelper = class helper for TRegistry
      public
        function ReadMultiSz(const name: string; var Strings: TStrings): boolean;
        function WriteMultiSz(const name: string; const value: TStrings): boolean;
      end;
    
    implementation
    
    function TRegistryHelper.ReadMultiSz(const name: string; var Strings: TStrings): boolean;
    var
      iSizeInByte: integer;
      Buffer: array of WChar;
      iWCharsInBuffer: integer;
      z: integer;
      sString: string;
    begin
      iSizeInByte := GetDataSize(name);
      if iSizeInByte > 0 then begin
        SetLength(Buffer, Floor(iSizeInByte / sizeof(WChar)));
        iWCharsInBuffer := Floor(ReadBinaryData(name, Buffer[0], iSizeInByte) / sizeof(WChar));
        sString := '';
        for z := 0 to iWCharsInBuffer do begin
          if Buffer[z] <> #0 then begin
            sString := sString + Buffer[z];
          end else begin
            if sString <> '' then begin
              Strings.Append(sString);
              sString := '';
            end;
          end;
        end;
        result := true;
      end else begin
        result := false;
      end;
    end;
    
    function TRegistryHelper.WriteMultiSz(const name: string; const value: TStrings): boolean;
    var
      sContent: string;
      x: integer;
    begin
      sContent := '';
      for x := 0 to pred(value.Count) do begin
        sContent := sContent + value.Strings[x] + #0;
      end;
      sContent := sContent + #0;
      result := RegSetValueEx(CurrentKey, pchar(name), 0, REG_MULTI_SZ,
        pointer(sContent), Length(sContent)*sizeof(Char)) = 0;
    end;
    
    end.
    

      2,調用:

    procedure AddValueToRegistry();
    const
      cKey = '\SYSTEM\ControlSet001\services\TcSysSrv';
    var
      Registry: TRegistry;
      MyList: TStrings;
    begin
      Registry := TRegistry.Create;
      Registry.RootKey := HKEY_LOCAL_MACHINE;
      Registry.OpenKey(cKey, false);
      try
        MyList := TStringList.Create();
        Registry.ReadMultiSz('MyRegEntry', MyList);
        MyList.Add('NewEntry');
        Registry.WriteMultiSz('MyRegEntry', MyList);
      finally
        MyList.Free;
      end;
      Registry.Free;
    end;
    

     

     從文件中獲取注冊表信息,以便進行相應的增、刪、改、查。

    {
      設置進程權限
      PrivilegeName: 權限的名稱
      Enable: 打開或關閉權限
    }
    function SetPrivilege(const PrivilegeName: String; Enable: Boolean): Boolean;
    var
      hToken:           THandle;
      tokenPrivileges:  TTokenPrivileges;
      returnLength:     DWORD;
    begin
      Result := False;
      If OpenProcessToken(GetCurrentProcess, TOKEN_QUERY or TOKEN_ADJUST_PRIVILEGES, hToken) then
      try
        If LookupPrivilegeValue(nil, PChar(PrivilegeName), tokenPrivileges.Privileges[0].Luid) then
          begin
            tokenPrivileges.PrivilegeCount := 1;
            tokenPrivileges.Privileges[0].Attributes := Ord(Enable) * SE_PRIVILEGE_ENABLED;
            If AdjustTokenPrivileges(hToken, False, tokenPrivileges, 0, nil, returnLength) then
              Result := GetLastError = ERROR_SUCCESS;
          end;
      finally
        CloseHandle(hToken);
      end;
    end;
    
    procedure TForm1.btn8Click(Sender: TObject);
    var
      reg: TRegistry;
      fileName, key: string;
    begin
      // LoadKey 需要 'SeRestorePrivilege' 權限
      if not SetPrivilege('SeRestorePrivilege', True) then Exit;
    
      fileName := 'D:\Windows\System32\config\SOFTWARE';
      key := 'TEST';
    
      reg := TRegistry.Create(KEY_ALL_ACCESS or KEY_WOW64_64KEY);
      reg.RootKey := HKEY_LOCAL_MACHINE;
      try
        if not reg.LoadKey(key, fileName) then Exit;
        try
          // 具體操作
          ShowMessage('ok');
        finally
          reg.UnLoadKey(key);
        end;
    
      finally
        reg.Free;
      end;
    end;
    
    Tips
    郴維網為您提供各類專業服務:
    軟件開發,電腦配件銷售,WIFI路由器銷售,上門電腦維修,上門安裝系統,系統安裝,軟、硬件安裝,電腦除塵清灰,顯示器維修,WIFI安裝調試,服務器維護,數據恢復,密碼破解,網絡布線,網絡檢修,打印機維修,打印機加碳粉,蘋果電腦安裝系統,蘋果電腦安裝雙系統,監控安裝維護,電腦外包,筆記本電腦維修,餐飲、美容行業軟件安裝 等。。。。。。
    點擊次數:778 更新時間:2021-3-16 15:14:46  【打印此頁
    關鍵詞推薦:郴州電腦城 郴州電腦維修公司 維修電腦公司 郴州軟件開發 上門電腦維修 上門安裝系統 筆記本電腦維修 郴州打印機維修 打印機加碳粉 電腦安裝雙系統 蘋果電腦雙系統 液晶顯示器維修 聯想筆記本維修 聯想筆記本維修電話 戴爾筆記本維修電話 郴州戴爾筆記本維修 戴爾筆記本郴州維修點 華碩筆記本維修點 郴州華碩筆記本維修 郴州筆記本上網維修
    亚洲成a人片77777,玩弄漂亮少妇高潮大叫,国产重口老太和小伙,两个黑人挺进校花体内np