본문 바로가기

Application Programming Interface/Windows API

기능별로 묶어보는 레지스트리 함수 – 3편. 키의 조회/생성/삭제

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

기능별로 묶어보는 레지스트리 함수.
3편. 키의 조회/생성/삭제

- by Tapitolife


(이 포스팅은 다음과 같은 사이트를 참고하여 작성되었습니다.)
MSDN Registry Functions (Windows):
http://msdn.microsoft.com/en-us/library/ms724875(v=VS.85).aspx

 키를 열고 닫아 보았다면, 이제 그 사이에 뭔가를 해 봐야겠죠. ㅋㅋ
이번에는 서브키들의 목록을 조회하고, 생성/삭제를 해 봅니다.

— RegEnumKey
지정한 키의 서브키들을 조회합니다.

LONG WINAPI RegEnumKey(
__in HKEY hKey,
__in DWORD dwIndex,
__out LPTSTR lpName,
__in DWORD cchName
);

hKey: 서브키를 조회할 대상 키입니다.

dwIndex: 몇 번째 서브키의 이름을 가져올 것인지를 지정합니다.
0부터 시작해서 1씩 더해진 값이어야 합니다.

lpName: 서브키의 이름을 담아 올 문자열 버퍼입니다.
미리 충분한 크기로 할당 되어 있어야 합니다.

cchName: lpName버퍼의 길이(단위: 문자)입니다.

▶ 반환: 해당 번호의 서브키 이름을 가져오는 데 성공하면 ERROR_SUCCESS,
더 이상 서브키가 없다면 ERROR_NO_MORE_ITEMS를 반환합니다.
그 외의 값들은 모두 winerror.h에 정의되어 있습니다.

— RegCreateKey
지정한 키의 서브키로 새 키를 만듭니다.

LONG WINAPI RegCreateKey(
__in HKEY hKey,
__in_opt LPCTSTR lpSubKey,
__out PHKEY phkResult
);

○ hKey: 서브키를 만들 대상 키 입니다.

○ lpSubKey: 새 서브키의 이름입니다.

○ phkResult: 새로 만들어진 서브키에 대한 핸들을 얻어 옵니다.

▶ 반환: 성공하면 ERROR_SUCCESS를 반환 합니다.
그 외의 값에 대해서는 모두 winerror.h에 선언되어 있습니다.

사용법:
"HKLM\Software\Tapito" 키를 만들고 싶다면?

HKEY hKey, hNewKey;
RegOpenKey(HKEY_LOCAL_MACHINE, TEXT("Software"), &hKey);

RegCreateKey(hKey, TEXT("Tapito"), &hNewKey);

— RegDeleteKey
지정한 키의 서브키를 지웁니다. 이 때, 지울 서브키 안에는 또 다른 서브키가 없어야 합니다.

LONG WINAPI RegDeleteKey(
__in HKEY hKey,
__in LPCTSTR lpSubKey
);

hKey: 삭제할 키가 있는 상위 키입니다.

lpSubKey: 삭제할 키의 이름입니다.

▶ 반환: 성공하면 ERROR_SUCCESS를 반환 합니다.
그 외의 값에 대해서는 모두 winerror.h에 선언되어 있습니다.

이 3개의 함수로 다음과 같은 예제를 만들어 볼 수 있습니다.

파일명: regtest2.c

#include <windows.h>
#include <stdio.h>
#include <conio.h>
int main()
{
    HKEY hKey1, hKey2;
    TCHAR keyName[512];
    DWORD i = 0;
    LONG result;

    printf(
"1. 'HKCU' 서브키들을 조회합니다.\n");
    memset(keyName, 0, 512 *
sizeof(TCHAR));
    printf(
"* HKEY_CURRENT_USER\n");
    while(RegEnumKey(HKEY_CURRENT_USER, i, keyName, 512) != ERROR_NO_MORE_ITEMS)
    {


        #if defined(_UNICODE) || defined(UNICODE)
        printf("\t* %ws\n", keyName);
        #else
        printf("\t* %s\n", keyName);
        #endif
        
// 유니코드에 대한 내용은 게시될 예정임.

        i++;
        memset(keyName, 0, 512 * sizeof(TCHAR));
    }

    printf("계속하려면 아무 키나 누르세요.\n");

    _getch();
    /////////////////////////////////////////////////////////////////////////////////////////////
    printf("2. 'HKCU\\Tapito\\레지스트리 키를 생성합니다.\n");
    result = RegCreateKey(HKEY_CURRENT_USER, TEXT(
"Tapito"), &hKey1);
    if(result == ERROR_SUCCESS)
    {
            printf(
"Tapito 키 생성 성공\n");
            result = RegCreateKey(hKey1, TEXT(
"레지스트리"), &hKey2);
            if(result == ERROR_SUCCESS) printf("레지스트리 키 생성 성공\n");
            else printf("레지스트리 키 생성 실패\n");
    }
    else printf("Tapito 키 생성 실패\n");

    RegCloseKey(hKey2);
    RegCloseKey(hKey1);

    printf(
"계속 하려면 아무 키나 누르세요.\n");
    _getch();

    /////////////////////////////////////////////////////////////////////////////////////////////
    printf("3. 'HKCU\\Tapito\\레지스트리' 키를 제거합니다.\n");
    RegDeleteKey(HKEY_CURRENT_USER, TEXT("Tapito\\레지스트리"));
    RegDeleteKey(HKEY_CURRENT_USER, TEXT("Tapito"));

    printf("계속 하려면 아무 키나 누르세요.\n");
    _getch();
    /////////////////////////////////////////////////////////////////////////////////////////////
    printf("끝.\n");
    _getch();
    return 0;
}

이 소스는 다음과 같은 결과를 출력합니다. (환경에 따라 결과가 다를 수 있습니다.)

- 1번 출력 결과

 - 2번 출력 결과

지정된 위치에 잘 생성 되었습니다.

- 3번 출력 결과

지정한 위치의 키를 잘 제거 했습니다.

 

마지막으로…