2009년 11월 7일 토요일

레지스트리 설명

레지스트리 설명

레지스트리는 데이타를 바이너리 파일에 저장한다. 어플리케이션이 레지스트리를 사용하기 위해서는 레지스트리 함수들을 사용해야 한다.

 

레지스트리의 구조

레지스트리는 데이타들을 계층적 트리구조에 저장한다. 트리의 각 노드들을 "키"라고 부른다. 각 키는 "서브키"나 "값"을 가질 수 있다. 종종 키 자체의 존재만이이 의미있을 경우가 있지만 대부분은 키와 연관된 값을 필요로 한다. 키는 여러개의 값을 가질 수 있고, 값은 어떤 형태라도 상관없다.

각 키는 ANSI 문자로 이름을 갖는다. 즉 ASCII 32 ~ 127사이의 이름을 갖는다. 키의 이름은 \, *, ?와 같은 문자를 쓸 수 없다. 그리고 "."으로 시작하는 이름은 이미 다른 용도로 예약되어 있다. 키의 이름은 계층 구조내에서만 유효하면 된다.

 

레지스트리 저장 공간

레지스트리에 모든 데이타를 다 저장할 수 없다. 너무 큰 레지스트리 파일은 시스템의 성능 저하를 가져온다. 그래서 레지스트리에서는 전역으로 필요한 데이타만 들어가고 나머지 데이타는 다른 곳에 저장되는 것이 바람직하다.

일반적으로 1KByte를 넘어가는 내용은 다른 파일로 저장되고, 레지스트리에서는 이 파일을 가리키도록 하는 것이 좋다.

값은 키에 비해서 훨씬 적은 공간을 차지한다. 공간을 절약하기 위해서는 트리구조를 간략하게 만들어야 한다.

 

이미 정의된 키들

레지스트리에 값을 넣기 위해서는 키를 먼저 오픈해야 한다. 키를 오픈하기 위해서는 이미 열려져 있는 다른 키의 핸들을 제공해야 한다. 시스템은 항상 열려져 있는 표준 핸들을 제공한다. 어플리케이션은 이 표준 핸들들을 이용하여 원하는 위치로 찾아갈 수 있다.

시스템은 레지스트리에 두개의 루트키를 제공한다.

HKEY_LOCAL_MACHINE과 HKEY_USERS가 그것이다. 또한 HKEY_LOCAL_MACHINE의 서브키로서 HKEY_CLASSES_ROOT와 HKEY_USERS의 서브키로서 HKEY_CURRENT_USER를 제공한다.

각 기정의 키들의 의미는 다음과 같다.

· HKEY_CLASSES_ROOT : 문서의 타입(혹은 클래스)와 연관된 속성들을 저장한다. 여기에 저장된 데이타는 윈도우즈의 쉘과 OLE에 의해서 사용된다.

· HKEY_CURRENT_USER : 현재 사용자의 세팅을 저장한다. 환경변수의 설정, 프로그램 그룹에 대한 데이타, 색상, 프린터, 네트웍 연결, 어플리케이션에 대한 정보가 들어간다.

· HKEY_LOCAL_MACHINE : 컴퓨터의 물리적 상태 (버스타입, 시스템 메모리, 설치된 하드웨어와 소프트웨어)를 나타낸다.

· HKEY_USERS : 새로운 사용자에 대한 디폴트 세팅을 가지고 있다.

 

데이타의 분류

데이타를 레지스트리에 넣기 전에, 어플리케이션은 데이타를 두가지의 부류로 분류해야 한다. 하나는 컴퓨터 특정적인 데이타이고, 다른 하나는 사용자 특정적인 데이타이다. 이런 구분을 통해서 어플리케이션은 여러 사용자의 세팅을 저장할 수 있다.

어플리케이션이 설치되면 컴퓨터 특정적인 데이타는 반드시 HKEY_LOCAL_MACHINE에 기록되어야 한다. 특별히 회사이름, 상품이름, 버전 등이 들어간다. 예를 들면 다음과 같다.

HKEY_LOCAL_MACHINE\Software\MyCompany\MyProduct\1.0

 

만일 어플리케이션이 OLE를 지원한다면 다음 키에 데이타를 넣어야 한다.

HKEY_LOCAL_MACHINE\Software\Classes

 

어플리케이션이 사용자 특정적인 데이타를 저장한다면 HKEY_CURRENT_USER에 저장해야 한다.

HKEY_CURRENT_USER\Software\MyCompany\MyProduct\1.0

 

키를 오픈, 생성, 닫기

레지스트리에 데이타를 넣기 위해서는 먼저 키를 오픈하거나 생성해야 한다. 키를 오픈하기 위해서 레지스트리 함수는 항상 열려져 있는 키를 기준으로 한다. 4가지의 이미 열려져 있는 키를 이용하면 된다. 키를 오픈하기 위해서는 RegOpenKey()나 RegOpenKeyEx()를 사용하면 된다. 키를 생성하기 위해서는 RegCreateKey()나 RegCreateKeyEx()를 사용하면 된다.

어플리케이션은 키를 닫고 저장하기 위해서 RegCloseKey()함수를 사용한다. 그러나 실제로 저장이 바로 이루어지진 않는다. 실제 저장을 위해서는 RegFlushKey()함수를 사용한다.

 

레지스트리 데이타를 쓰고 지우기

RegSetValue()와 RegSetValueEx()함수를 이용하여 키에 데이타를 넣을 수 있다. RegSetValue는 오직 스트링 형(REG_SZ)에 대해서만 기록할 수 있는 반면에 RegSetValueEx는 어떤 데이타타입도 쓸 수 있다.

키에서 값을 지우기 위해서는 RegDeleteValue()함수를 사용한다. 만일 키를 지우기 위해서는 RegDeleteKey()함수를 사용한다.

키의 보안정보를 바꾸기 위해서는 RegSetKeySecurity()를 사용한다.

레지스트리에서 데이타를 읽기

레지스트리에서 데이타를 읽기 위해서 어플리케이션은 보통 특정키를 찾을 때까지 서브키를 탐색하게 된다. 이를 위해서 RegEnumKey()와 RegEnumKeyEx()함수를 사용할 수 있다.

특정한 서브키에 대한 자세한 정보를 얻고 싶으면 RegQueryInfoKey()를 사용한다. 만일 보안 상태를 얻고 싶다면 RegGetKeySecurity()를 사용한다.

어플리케이션은 키에 해당하는 값들을 얻기 위해 RegEnumValue()함수를 사용할 수 있다. RegQueryValue()나 RegQueryValueEx()함수는 키의 특정한 값을 읽기 위해 사용한다. RegQueryValue()는 값의 이름만을 얻고자 할 때, ReqQueryValueEx()는 값의 이름과 데이타를 얻고자할 때 사용한다.

RegQueryValue와 RegQueryValueEx의 차이는 환경변수를 확장시켜주느냐에도 있다. RegQueryValue는 %PATH%와 같은 환경변수를 확장시켜 주지만 RegQueryValueEx는 확장시켜 주지 않는다. 이 때 ExpandEvironmentStrings를 사용하면 쉽게 확장시킬 수 있다.

 

레지스트리 파일

어플리케이션은 레지스트리의 일부를 파일로 저장할 수도 있고, 저장된 파일에서 읽어들일 수도 있다. 이런 기능은 많은 키와 값을 설정해야 할 경우 편리하다.

레지스트리의 일부를 파일로 저장할 때에는 RegSaveKey()함수를 사용한다. 파일에서 읽어들일 때는 RegLoadKey(), RegReplaceKey(), RegRestoreKey()를 사용한다.

RegLoadKey()는 레지스트리 파일을 읽어 키와 값들을 설정한다. 설정을 복원하려면 RegUnLoadKey()를 사용하면 된다.

 

====================================================================================================

 

댓글 없음:

댓글 쓰기