C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[17507] Re:Re:'reg_multi_sz' 형식의 레지스트리 데이타를 읽어들일 때
강창수 [pakkum] 2153 읽음    2002-04-13 13:50
델파이를 전혀 모르기에 얼핏봤는데 결국은 win32api를 이용하는군요.

결국은 노가다를 해야겠군요..

ㅋㅋ....

유영인 [Chris] 님이 쓰신 글 :
: REG_MULTI_SZ 에서 각 항목의 분리는 #0 으로 하며, 맨 끝은 #0, #0 으로 끝납니다.
:
: 아래 소스는 줄줄히 읽어서 TStrings 객체에 집어 넣는 델파이 예제 입니다.
:
:
:
: 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;
:
:
: ps. EExRegistryException is just this...
:
: 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;
:
: ...
:
: 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;
:
:
: 강창수 님이 쓰신 글 :
: : 어떻게 하나요?
: :
: : 빌더5에서 제공하는 TRegistry->GetDataType으로 조사해보니 rdUnknown으로 나오더군요.
: :
: : 'reg_multi_sz'이라는 것이 두개의 널 문자열로 끝나는 문자열이라는데,
: :
: : TRegistry->ReadString으로는 안읽히는군요.
: :
: : IpAddress, Gateway SubnetMask같은 것들이 'reg_multi_sz' 형식으로 저장되는데(win2k에서)
: :
: : 어떻게 읽어야 할까요?
: :
: : 현재는 Win32Api로 시도해볼려고 하는데, 빌더5에서 제공하는 다른 방법이 있는지 궁금합니다.
: :
: : 그럼 답변 기다리겠습니다......

+ -

관련 글 리스트
17480 'reg_multi_sz' 형식의 레지스트리 데이타를 읽어들일 때 강창수 1228 2002/04/12
17495     Re:'reg_multi_sz' 형식의 레지스트리 데이타를 읽어들일 때 유영인 [Chris] 2017 2002/04/13
17507         Re:Re:'reg_multi_sz' 형식의 레지스트리 데이타를 읽어들일 때 강창수 2153 2002/04/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.