'언어/Widget'에 해당하는 글 1건

1. 함수의 원형
   
    LONG RegSetValueEx(HKEY hKey, LPCTSTR lpValueName, DWORD lpReserved,
                                 DWORD dwType, const BYTE *lpData, DWORD cbData);
 
 
2. 함수의 기능

 
    열려있는 레지스트리 키(hKey)를 이용하여 lpValueName에 명시된 항목이름의 데이터 형식이나 내용을
    설정하는데 사용하는 함수이다.
 
  
3. 함수의 매개변수에 대한 설명
 
    3.1 hKey
        현재 열어서 사용하고 있는 레지스트리 키에 대한 핸들을 명시하거나 미리 정의 되어진 아래와 같은
        값들중에 하나를 명시한다.
        ( 이 함수를 사용하기 위해서는 키를 열때 KEY_SET_VALUE 권한을 반드시 설정해야 한다. )
 
        3.1.1 HKEY_CLASSES_ROOT
        3.1.2 HKEY_CURRENT_CONFIG
        3.1.3 HKEY_CURRENT_USER
        3.1.4 HKEY_LOCAL_MACHINE
        3.1.5 HKEY_USERS
        3.1.6 HKEY_PERFORMANCE_DATA (Windows NT/2000/XP에서 사용가능)
        3.1.7 HKEY_DYN_DATA (Windows 95/98/Me에서 사용가능)
 
    3.2 lpValueName
 
        정보를 설정하고자 하는 항목의 이름을 가지고 있는 문자열의 주소를 명시한다. 만약, hKey에 속한
        항목들중에서 lpValueName에 명시된 이름을 가진 항목이 존재하지 않는다면 lpValueName에 명시된
        이름으로 항목을 추가한다. 그리고 이 문자열은 NULL로 끝나는 문자열이여야 한다.

        아래와 같이 컴퓨터의 레지스트리 정보중에서 HKEY_LOCAL_MACHINE 항목의
        HARDWARE - DEVICEMAP - VIDEO 에 있는 세부항목인 VgaCompatible에 값을 설정하려면 다음과 같이
        코드가 구성될 것이다.
   

        HKEY h_key;
        // HKEY_LOCAL_MACHINE 항목에 속한 "HARDWARE\\DEVICEMAP\\VIDEO" 항목을 열고
        // h_key에 그 핸들값을 저장한다. RegSetValueEx 함수를 사용하기 위해서는 KEY_SET_VALUE 권한을
        // 사용해서 열어야 한다.
        int ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\VIDEO",
                                                    0, KEY_SET_VALUE, &h_key);
        // VgaCompatible 항목에 값을 설정하기 위해서는 아래와 같이 명시하면 된다.
        if(ret == ERROR_SUCCESS){
            RegSetValueEx(hKey, "VgaCompatible", <생략>);
        }
        if(hKey != NULL) RegCloseKey(hKey);
 
        만약, lpValueName에 NULL 또는 텅빈 문자열("")의 주소를 명시한다면 현재 열려있는 레지스트리 키의
        기본값 항목 또는 이름이 없는 항목의 데이터 형식이나 내용을 설정하겠다는 뜻이다.
        Windows 95/98/Me에서는 새로운 키를 만들면 값이 설정되지 않은 "기본값"이라는 항목이 생성된다.
        Windows 95에서는 이 "기본값" 항목의 데이터 형식이 항상 REG_SZ로 유지되지만  Windows 98의 경우,
        RegSetValueEx 값을 이용하여 REG_SZ 형식을 다른 형식으로 변경할수 있다.
       
    3.3 Reserved
 
        0 을 명시하면 된다. ( 예약된 값 )
 
    3.4 dwType
 
        lpData에 들어있는 정보를 설정할 항목의 데이터 형식을 명시한다. 만약, 해당 항목의 데이터
        형식을 알지 못한다면 RegQueryValueEx 함수를 이용하여 데이터 형식을 알아내면 된다.
        이 함수에서 사용가능한 데이터 형식에 대한 코드 값은 아래와 같다.
        3.4.1 REG_BINARY  - 여러개의 이진값(실제로는 16진수)으로 구성되어 있는 데이터 형식
 
               

        3.4.2 REG_DWORD  - 32비트 크기의 정수 데이터 형식
        3.4.3 REG_DWORD_LITTLE_ENDIAN - 32비트 크기의 정수 데이터 형식 (바이트 정렬 : little endian)
                                         0x12345678 저장 -> 0x78, 0x56, 0x34, 0x12 형식으로 저장됨
                                         Windows 95/98/Me, NT/2000/XP는 little endian 방식을 사용한다.
        3.4.4 REG_DWORD_BIG_ENDIAN - 32비트 크기의 정수 데이터 형식 (바이트 정렬 : big endian)
                                      0x12345678 저장 -> 0x12, 0x34, 0x56, 0x78 형식으로 저장됨
                                      UNIX 계열의 운영체제는 big endian 방식을 사용한다.
        3.4.5 REG_SZ - NULL로 끝나는 문자열 형식
        3.4.6 REG_MULTI_SZ - NULL로 끝나는 문자열이 나열되어 있는 형식. 종결시에는 NULL을 연속해서 사용
                             예를들어, "홍길동", "홍순이"와 같은 두 문자열이 REG_MULTI_SZ 형식으로
                             구성된다면 "홍길동(NULL)홍순이(NULL)(NULL)" 이다.
        3.4.7 REG_EXPAND_SZ - NULL로 끝나는 문자열 형식이다. 하지만 REG_SZ 형식과는 달리 환경변수를
                              참조할수 있는 형식이 포함될수 있다.
                              예를들어, C:\Program Files\Microsoft Visual Studio\VC98\cl.exe와 같은
                              문자열 정보를 %PATH%\cl.exe와 같이 사용할수 있는 형식이다.
        3.4.8 REG_RESOURCE_LIST - 장치 드라이버(Device Driver)의 자원 목록에 관련된 형식
        3.4.9 REG_NONE - 데이터 형식이 정해져 있지 않은 경우
        ( REG_LINK와 같은 코드 값도 있지만 응용프로그램에서는 이 값을 사용하지 않는다. )
  
    3.5 lpData
 
        설정할 항목에 사용할 데이터가 들어있는 메모리 공간의 주소를 명시한다. 해당 데이터가 문자열
        형식(REG_SZ)이라면 NULL로 끝나는 문자열이여야 하고 다중문자열(REG_MULTI_SZ)형식이라면 마지막에
        NULL을 두번 연속사용해야 한다.
 
        예를 들어, HARDWARE\\DEVICEMAP\\VIDEO 키에 존재하지 않는 MyData라는 항목을 문자열(REG_SZ) 형식으로
        추가하고 "MyVideo"라는 내용을 설정한다면 아래와 같이 코드를 구성하면 된다.
        ( 만약, 해당 위치에 MyVideo라는 항목이 있다면 내용만 갱신될 것이다. )
       
        HKEY h_key;
        int ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\VIDEO",
                                                      0, KEY_SET_VALUE, &h_key);
        if(ret == ERROR_SUCCESS){
            char buffer[64] = "MyVideo";
            RegSetValueEx(hKey, "MyData", 0, REG_SZ, (const unsigned char *)buffer, <생략>);
        }
        if(hKey != NULL) RegCloseKey(hKey);
 
    3.6 cbData
 
        lpData 매개변수에 사용한 메모리 공간의 크기를 명시한다. 만약, lpData에 사용한 정보가 문자열 형식
        (REG_SZ, REG_MULTI_SZ, REG_EXPAND_SZ) 중에 하나라면 해당 문자열의 길이를 명시하면 된다. 즉,
        메모리 공간의 크기가 64라고 할지라도 내용이 "MyVideo"라면 8( 7 + NULL 문자 포함)을 명시하면 된다.
        바로 위에서 사용한 예제 코드를 완성해보면 아래와 같다.
        ( 크기는 바이트 단위이다. 즉, 3이면 3바이트이다. )
 
        HKEY h_key;
        int ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\VIDEO",
                                                      0, KEY_SET_VALUE, &h_key);
        if(ret == ERROR_SUCCESS){
            char buffer[64] = "MyVideo";
            RegSetValueEx(hKey, "MyData", 0, REG_SZ, (const unsigned char *)buffer, <생략>);
        }
        if(hKey != NULL) RegCloseKey(hKey);
 
 
4. 함수의 반환값
 
    이 함수가 성공적으로 작업을 완료했다면 ERROR_SUCCESS 값을 반환한다. 만약, 실패했다면 0이 아닌 값을
    반환하고 이 에러값은 winerror.h에 정의 되어 있다. 그리고 에러에 대한 좀더 상세한 내용을 알고 싶다면
    FORMAT_MESSAGE_FROM_SYSTEM 값을 이용하여 FormatMessage 함수를 호출하면 된다.
 
 
5. 함수 사용시 주의사항
 
    정보를 저장할때 레지스트리의 효율적인 사용을 위해서 크기가 2048보다큰 정보는 별도의 파일을 만들고
    그 파일 이름을 저장하는것이 좋다. 즉, 무리하게 큰 정보를 레지스트리에 직접 저장하는것은 레지스트리의
    효율성을 저해하는 요소가 될것이다.
    이 함수를 사용하기 위해서는 레지스트리 키를 열때 RegCreateKeyEx 또는 RegOpenKeyEx 함수를 사용해야하고
    이 두 함수 중에 하나를 호출할때 KEY_SET_VALUE 권한을 명시해야 한다.
    Windows 95/98/Me에서는 레지스트리 서브키나 값의 이름은 그 문자열의 길이가 255를 초과할수 없다. 그리고
    설정하고자 하는 데이터의 크기는 16,300Bytes를 넘을수 없다. 또한 한개의 키에 여러개의 항목이 있는 경우,
    각 항목에 설정된 데이터의 크기를 합산한 값이 64KBytes를 넘어서도 안된다.
 
 
6. 함수의 요구사항
 
    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.
 


WRITTEN BY
정현석
이것저것 끄적끄적....

,