全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1162
推到 Plurk!
推到 Facebook!

Delphi下如何读写多字符串值(REG_MULTI_SZ类型)的键值

尚未結案
zouhw
一般會員


發表:6
回覆:13
積分:3
註冊:2004-07-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-14 11:06:52 IP:210.76.xxx.xxx 未訂閱
请教一个问题: Delphi下如何读写多字符串值(REG_MULTI_SZ类型)的键值?结果定 义为string类型,则使用readstring运行时提示读取的数据类型类型不对。结果定 义为TstringList类型,则使用readstring,编译时提示类型不匹配?请问,如何读写? 我想读取注册表中的IP地址?请问谁能给予指点,谢谢,望尽快 一切皆有可能!
------
dsf
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-14 13:40:55 IP:202.39.xxx.xxx 未訂閱
參考這篇 Delphi 下如何讀寫多字符串值(REG_MULTI_SZ 類型): http://www.china-askpro.com/msg48/qa05.shtml 或 http://groups.google.com/groups?q=REG_MULTI_SZ+%2B+delphi&hl=zh-TW&lr=&ie=UTF-8&selm=3bb7c2ff.205619204%40newsgroups.borland.com&rnum=2    -- 向 KTop 的弟兄們致敬!  發表人 - hagar 於 2004/07/14 13:42:41
zouhw
一般會員


發表:6
回覆:13
積分:3
註冊:2004-07-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-14 15:55:03 IP:210.76.xxx.xxx 未訂閱
用Write_MULTI_SZ_Strings(const valueName: string; strings: TStrings); 向注册表写值时,没有反应,代码如下:    procedure TForm1.Button1Click(Sender: TObject); var     ipzhw:TStrings; begin     ipzhw:=TStringList.Create;    //  ipzhw.Add('172.18.70.55');        ipzhw.Append('31 00 37 00 32 00 2E 00');     ipzhw.Append('31 00 38 00 2E 00 37 00');     ipzhw.Append('30 00 2E 00 35 00 35 00');     ipzhw.Append('00 00 00 00');        Write_MULTI_SZ_Strings('IPAddress',ipzhw); end;    什么原因呢!    < >< > 一切皆有可能!
------
dsf
zouhw
一般會員


發表:6
回覆:13
積分:3
註冊:2004-07-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-21 11:53:42 IP:210.76.xxx.xxx 未訂閱
用Write_MULTI_SZ_Strings(const valueName: string; strings: TStrings); 向注册表写值时,没有反应,代码如下: procedure TForm1.Button1Click(Sender: TObject); var ipzhw:TStrings; begin ipzhw:=TStringList.Create; // ipzhw.Add('172.18.70.55'); ipzhw.Append('31 00 37 00 32 00 2E 00'); ipzhw.Append('31 00 38 00 2E 00 37 00'); ipzhw.Append('30 00 2E 00 35 00 35 00'); ipzhw.Append('00 00 00 00'); Write_MULTI_SZ_Strings('IPAddress',ipzhw); end; 什么原因呢! 一切皆有可能!
------
dsf
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-21 14:08:51 IP:202.39.xxx.xxx 未訂閱
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Buttons, Registry, StdCtrls;

type
  TExRegistry = class(TRegistry)
  public
    procedure ReadStrings(const valueName: string; strings: TStrings);
    procedure WriteStrings(const valueName: string; strings: TStrings);
  end;    type
  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;    type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.DFM}    { TExRegistry }    procedure TExRegistry.ReadStrings(const valueName: string;
  strings: TStrings);
var
  valueType : DWORD;
  valueLen : DWORD;
  p, buffer : PChar;
begin
  strings.Clear;
  SetLastError (RegQueryValueEx (CurrentKey, PChar (valueName), Nil, @valueType, Nil, @valueLen));
  if GetLastError = ERROR_SUCCESS then
    if valueType = REG_MULTI_SZ then
    begin
      GetMem (buffer, valueLen);
      try
        RegQueryValueEx (CurrentKey, PChar (valueName), Nil, Nil, PBYTE(buffer), @valueLen);
        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 ('String list expected')
  else
    raise EExRegistryException.CreateLastError('Unable read MULTI_SZ value')
end;    procedure TExRegistry.WriteStrings(const valueName: string;
  strings: TStrings);
var
  p, buffer : PChar;
  i : Integer;
  size : DWORD;
begin
  size := 0;
  for i := 0 to strings.Count - 1 do
    Inc (size, Length (strings [i])   1);
  Inc (size);
  GetMem (buffer, size);
  try
    p := buffer;
    for i := 0 to strings.count - 1 do
    begin
      lstrcpy (p, PChar (strings [i]));
      Inc (p, lstrlen (p)   1)
    end;
    p^ := #0;
    SetLastError (RegSetValueEx (CurrentKey, PChar (valueName), 0, REG_MULTI_SZ, buffer, size));
    if GetLastError <> ERROR_SUCCESS then
      raise EExRegistryException.CreateLastError('Unable to write MULTI_SZ value');
  finally
    FreeMem (buffer)
  end
end;    { EExRegistryException }    constructor EExRegistryException.Create(code: DWORD; const st: string);
begin
  fCode := code;
  inherited Create (GetError   ':'   st);
end;    constructor EExRegistryException.CreateLastError(const st: string);
begin
  fCode := GetLastError;
  inherited Create (GetError   ':'   st);
end;    function EExRegistryException.GetError: string;
var
  msg : string;      function GetErrorMessage (code : Integer) : string;
  var
    hErrLib : THandle;
    msg : PChar;
    flags : Integer;        function MAKELANGID (p, s : word) : Integer;
    begin
      result := (s shl 10) or p
    end;
  begin
    hErrLib := LoadLibraryEx ('netmsg.dll', 0, LOAD_LIBRARY_AS_DATAFILE);
    try
      flags := FORMAT_MESSAGE_ALLOCATE_BUFFER or
               FORMAT_MESSAGE_IGNORE_INSERTS or
               FORMAT_MESSAGE_FROM_SYSTEM;
      if hErrLib <> 0 then
        flags := flags or FORMAT_MESSAGE_FROM_HMODULE;          if FormatMessage (flags, pointer (hErrLib), code,
                        MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
                        PChar (@msg), 0, Nil) <> 0 then
        try
          result := msg;
        finally
          LocalFree (Integer (msg));
        end
    finally
      if hErrLib <> 0 then
        FreeLibrary (hErrLib)
    end
  end;
begin
  msg := GetErrorMessage (fCode);
  if msg = '' then
    result := Format ('Error %d', [fCode])
  else
    result := Format ('Error %d : %s', [fCode, msg])
end;    // 讀的部份
procedure TForm1.Button1Click(Sender: TObject);
var
  reg: TExRegistry;
begin
  reg := TExRegistry.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    if reg.OpenKey('SOFTWARE\Microsoft\Active Setup\InstallInfo', False) then
      reg.ReadStrings('InstalledComponents', Memo1.Lines);
  finally
    reg.Free;
  end;
end;    // 寫的部份
procedure TForm1.Button2Click(Sender: TObject);
var
  reg: TExRegistry;
begin
  reg := TExRegistry.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    if reg.OpenKey('SOFTWARE\Microsoft\Active Setup\InstallInfo', False) then
      reg.WriteStrings('Test', Memo1.Lines);
  finally
    reg.Free;
  end;
end;    end.
-- 向 KTop 的弟兄們致敬! 發表人 - hagar 於 2004/07/21 14:11:46
zouhw
一般會員


發表:6
回覆:13
積分:3
註冊:2004-07-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-22 11:22:57 IP:210.76.xxx.xxx 未訂閱
谢谢hagar    我对你的敬仰如滔滔江水连绵不绝,又如黄河泛滥一发而不可收拾。     一切皆有可能!
------
dsf
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-04-26 13:51:38 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-05-18 16:34:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!