본문 바로가기
프로그래밍/Windows API

레지스터 관련 - RegSetValueEx 함수

by 호군 2010. 10. 27.
반응형
RegSetValueEx
  - 해당키에 값을 지정할 때 사용합니다.
LONG WINAPI RegSetVlaueEx(
    HKEY hKey,
    LPCTSTR lpValueName,
    DWORD lpReserved,
    DWORD dwType,
    const BYTE *lpData,
    BYTE *cbData,

);


Parameters

hKey
해당 레지스트리 키의 핸들. RegCreateKeyEx 또는 RegOpenKeyEx 로 획득한 핸들이나
기본적으로 정의되어 있는 키의 핸들(predefined keys)을 사용합니다.      
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS

lpValueName
해당 레지스트리 이름.
정보를 설정하고자 하는 항목의 이름을 가지고 있는 문자열의 주소를 명시한다. 만약, hKey에 속한 항목들중에서 lpValueName에 명시된 이름을 가진 항목이 존재하지 않는다면 lpValueName에 명시된 이름으로 항목을 추가한다. 그리고 이 문자열은 NULL로 끝나는 문자열이여야 한다.현재는 사용하지 않습니다. 미래를 위해 예약된 인자입니다. 반드시 0 을 주어야 합니다.

lpReserve 
예약된 값으로 0을 입력. ( 예약된 값 )

dwType
lpData에 들어있는 정보를 설정할 항목의 데이터 형식을 명시한다. 만약, 해당 항목의 데이터 형식을 알지 못한다면 RegQueryValueEx 함수를 이용하여 데이터 형식을 알아내면 된다. 이 함수에서 사용가능한 데이터 형식에 대한 코드 값은 아래와 같다.

REG_BINARY  - 여러개의 이진값(실제로는 16진수)으로 구성되어 있는 데이터 형식

REG_DWORD  - 32비트 크기의 정수 데이터 형식
REG_DWORD_LITTLE_ENDIAN 
- 32비트 크기의 정수 데이터 형식 (바이트 정렬 : little endian)
                                              0x12345678 저장 -> 0x78, 0x56, 0x34, 0x12 형식으로 저장됨 
                                              Windows 95/98/Me, NT/2000/XP는 little endian 방식을 사용한다.
REG_SZ - NULL로 끝나는 문자열 형식
REG_MULTI_SZ - NULL로 끝나는 문자열이 나열되어 있는 형식. 종결시에는 NULL을 연속해서 사용
                         
예를들어, "홍길동", "홍순이"와 같은 두 문자열이 REG_MULTI_SZ 형식으로 구성된다면
                          "홍길동(NULL)홍순이(NULL)(NULL)" 이다.

REG_EXPAND_SZ - NULL로 끝나는 문자열 형식이다. 
                             하지만 REG_SZ 형식과는 달리 환경변수를 참조할수 있는 형식이 포함될수 있다.
           
                  예를들어, C:\Program Files\Microsoft Visual Studio\VC98\cl.exe와 같은 문자열 정보를
                             %PATH%\cl.exe와 같이 사용할수 있는 형식이다.
REG_RESOURCE_LIST - 장치 드라이버(Device Driver)의 자원 목록에 관련된 형식
REG_NONE - 데이터 형식이 정해져 있지 않은 경우
                   ( REG_LINK와 같은 코드 값도 있지만 응용프로그램에서는 이 값을 사용하지 않는다.)

lpData 
설정할 항목에 사용할 데이터가 들어있는 메모리 공간의 주소를 명시한다. 해당 데이터가 문자열 형식(REG_SZ)이라면 NULL로 끝나는 문자열이여야 하고 다중문자열(REG_MULTI_SZ)형식이라면 마지막에 NULL을 두번 연속사용해야 한다.

cbData 
lpData 매개변수에 사용한 메모리 공간의 크기를 명시한다. 만약, lpData에 사용한 정보가 문자열 형식(REG_SZ, REG_MULTI_SZ, REG_EXPAND_SZ) 중에 하나라면 해당 문자열의 길이를 명시하면 된다. 즉, 메모리 공간의 크기가 64라고 할지라도 내용이 "MyVideo"라면 8( 7 + NULL 문자 포함)을 명시하면 된다. 바로 위에서 사용한 예제 코드를 완성해보면 아래와 같다. ( 크기는 바이트 단위이다. 즉, 3이면 3바이트이다. )
Return Value
이 함수가 성공적으로 작업을 완료했다면 ERROR_SUCCESS 값을 반환한다. 만약, 실패했다면 0이 아닌 값을 반환하고 이 에러값은 winerror.h에 정의 되어 있다. 그리고 에러에 대한 좀더 상세한 내용을 알고 싶다면 FORMAT_MESSAGE_FROM_SYSTEM 값을 이용하여 FormatMessage 함수를 호출하면 된다.


함수 사용시 주의사항 

    정보를 저장할때 레지스트리의 효율적인 사용을 위해서 크기가 2048보다큰 정보는 별도의 파일을 만들고
    그 파일 이름을 저장하는것이 좋다. 즉, 무리하게 큰 정보를 레지스트리에 직접 저장하는것은 레지스트리의
    효율성을 저해하는 요소가 될것이다.
    이 함수를 사용하기 위해서는 레지스트리 키를 열때 RegCreateKeyEx 또는 RegOpenKeyEx 함수를 사용해야하고
    이 두 함수 중에 하나를 호출할때 KEY_SET_VALUE 권한을 명시해야 한다.
    Windows 95/98/Me에서는 레지스트리 서브키나 값의 이름은 그 문자열의 길이가 255를 초과할수 없다. 그리고
    설정하고자 하는 데이터의 크기는 16,300Bytes를 넘을수 없다. 또한 한개의 키에 여러개의 항목이 있는 경우,
    각 항목에 설정된 데이터의 크기를 합산한 값이 64KBytes를 넘어서도 안된다.

요구사항

    Window NT/2000/XP: Included in Windows NT 3.1 and later.
    Windows 95/98/Me: Included in Windows 95 and Later.
    Header: Declared in Winbase.h: Include Windows.h.
    Library: Use Advapi32.lib.
    Unicode: Implemented as Unicode and ANSI versions on Windows NT/2000/XP.
                 Also supported by Microsoft Layer for Unicode.


반응형