'RegCreateKeyEx'에 해당되는 글 2건

  1. 2009.05.29 레지스트리(Registry)
  2. 2008.08.19 Windows 프로그램을 시작 프로그램으로 등록하기
2009. 5. 29. 15:43

레지스트리(Registry)


프로그램은 실행중에 사용자가 입력한 옵션 설정이나 프로그램 스스로 만들어낸 정보들을 다음 실행을 위해서 저장을 해두어야 할 필요가 있다. 레지스트리(Registry)는 프로그램 실행중에 일어나는 상황이라든지 프로그램의 설정 정보를 저장하기 위해 사용된다. 저장의 대상은 사용자의 신상, 프로그램의 위치, 크기, 옵션, 설정 등의 프로그램 동작에 필요한 모든 정보가 될 수 있다.
이러한 레지스트리 설정을 통해 프로그램이 다음 실행시에도 이전의 상태 그대로를 유지 할 수 있는 것을 볼 수 있다.

등록된 레지스트리를 보거나 수정을 하려면 시작->실행에서 regedit를 입력후 엔터키를 치면 확인할 수 있다.

레지스트리를 다루는 데 주로 사용되는 함수들은 아래와 같다.

레지스트리 키를 생성하는 함수이다. 이미 키가 생성되어 있는 상태라면 해당 키를 열기만 한다. 이 함수의 인수는 9개로 많기는 하지만, 대부분의 인수는 디폴트로 적용된다.
LONG RegCreateKeyEx(
                                    HKEY hKey,
                                    LPCTSTR LpSubKey,
                                    DWORD Reserved,
                                    LPTSTR lpClass,
                                    DWORD dwOptions,
                                    REGSAM samDesired,
                                    LPSECURITU_ATTRIBUTES  lpSecurityAttributes,
                                    PHKEY phkResult,
                                    LPDWORD lpdwDisposition
                                   );
hKey - 새로 만들어지는 키의 부모키를 지정한다.
            응용 프로그램들이 주로 사용하는 키는  HKEY_CURRENT_USER 키이고, 이 키 아래 Software 서브
            키에 자신의 서브키를 생성하여 사용한다.
            운영체제에 의해 사용할 수 있는 키는 아래와 같다.
              HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, ....

lpSubKey - 만들고자(혹은 열고자) 하는 서브키를 지정하는 널을 포함하는 문자열로 반드시 지정해 주어야
                   한다.

Reserved - 예약..

lpClass - 생성되는 키의 클래스를 지정하는 문자열이다.
                이미 존재하는 키를 오픈할 때 이 인수는 무시되고, 클래스를 지정하지 않을 때에는 NULL로 설정
                한다.

dwOptions - 생성하는 키의 옵션을 지정한다.(키를 생성할 때만 적용된다.)
                     REG_OPTION_NON_VOLATILE
                     REG_OPTION_VOLATILE
                     REG_OPTION_BACKUP_RESTORE

samDesired - 새로 만들어지는 키의 보안 속성을 설정한다.

lpSecurityAttributes - 키값이 차일드 프로세스로도 상속 될 것인가를 지정하는 SECURITY_ATTRIBUTE
                                   구조체의 포인터이다. NULL이면 상속되지 않는다.

phkResult - 만들어지거나 열려진 키값이 대입되는 변수의 포인터이다.
                   이 인수가 지정한 변수에 생성된(열린) 키값을 리턴한다. 리턴값은 HKEY형의 현수이다.

lpdwDisposition - 키가 새로 생성되었는지 기존의 키가 오픈 된것인지를 리턴받기 위한 출력용 변수이다.
                             REG_CREATED_NEW_KEY : 생성된 키,
                             REG_OPENED_EXISTING_KEY : 기존의 키가 오픈된 것
예)
RegCreateKeyEx ( HKEY_CURRENT_USER, "Software\\Wizntec\\RegiTest\\Position", 0, NULL,
                           REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &dwDisp );

RegCreateKeyEx()에 의해 열려진 레지스트리 키는 아래의 RegSetValueEx()함수를 통해서 조작할 수 있다.
LONG RegSetValueEx( HKEY hKey,
                                      LPCTSTR lpValueName,
                                      DWORD Reserved,
                                      DWORD dwType,
                                      CONST BYTE *lpData,
                                      DWORD cbData
                                     );
hKey - 값을 저장하고자 하는 키 핸들
lpValueName - 값의 이름을 지정하는 문자열, 해당 키에 값이 없으면 새로 생성해서 데이터를 저장한다.
dwType - 값의 형(type), 대부분 정수형(REG_DWORD)과 문자열(REG_SZ)를 사용한다.
lpData - 저장하고자 하는 데이터의 포인터이다.
cbData - 데이터의 크기 값


RegCreateKeyEx()에 의해 오픈된 레지스트리로부터 RegQueryValueEx()를 사용해서 값을 읽어올 수 있다.
LONG RegQueryValueEx( HKEY hKey,
                                           LPTSTR lpValueName,
                                           LPDWORD lpReserved,
                                           LPDWORD lpType,
                                           LPBYTE lpData,
                                           LPDWORD lpcbData
                                         );
첫 번째 ~ 세 번째 인수는 이전과 동일.
lpType - 읽은 값의 타입을 대입받을 변수의 포인터
lpData - 읽혀진 값을 대입받을 변수의 번지
lpcbData - 이 변수의 크기값을 가지는 변수의 번지


RegOpenKeyEx() 함수는 레지스트리를 열기만 하는 함수이다. 보통 RegCreateKeyEx()를 주로 이용하여 잘 사용되지 않는 함수이다.
LONG RegOpenKeyEx( HKEY hKey,
                                      LPCTSTR lpSubKey,
                                      DWORD ulOptions,
                                      PHKEY phkResult
                                    );


마지막으로 열려진 레지스트리 키를 닫는 함수이다.
LONG RegCloseKey( HKEY hKey );

레지스트리의 예제는 윈도우즈 API 정복을 참조했으며 아래 파일을 통해 테스트 하면 된다.


'Programmings > Windows Programming' 카테고리의 다른 글

WinIO  (0) 2009.06.23
IME 입력모드 설정  (5) 2009.05.29
다른 윈도우에서의 GetFocus() 사용하기  (0) 2009.05.28
서브클래싱  (0) 2009.05.26
GetWindowThreadProcessId()  (0) 2009.05.18
2008. 8. 19. 16:56

Windows 프로그램을 시작 프로그램으로 등록하기



MS Windows를 부팅할 때 자동으로 시작하는 프로그램을 볼 수 있다.
그리고 실제 자신이 작성한 프로그램도 그런 프로그램들 처럼 Windows가 시작할 때 자동으로 실행시킬 수 있다.

방법은 여러가지가 있다.

첫번 째는 가장 쉬운 방법으로 "시작 프로그램에 바로가기 복사"를 하는 방법이다.
"C:\Documents and Settings\사용자 폴더\시작 메뉴\프로그램\시작프로그램"에 자동으로 시작하기를 원하는 프로그램의 바로가기를 복사하면 된다.

두번 째는 "win.ini 파일에 등록"하는 방법이다.
"시작 -> 실행 -> sysedit" 를 실행 하여, 자동으로 실행하고자 하는 프로그램을 등록하면 된다.
load - Windows가 부팅할 때 자동으로 시작하는 프로그램을 등록한다.
run - load와 같이 자동  시작 프로그램을 등록한다.

세번 째는 "registry에 등록"하는 방법이다.
"HKEY_LOCAL_MACHINE의 Software\Microsoft\Windows\CurrentVersion\run"가 시작프로그램들이 위치하는 레지스트리의 위치이다. 이곳에 자동으로 시작하는 프로그램을 등록하면 된다.

아래와 같이 하면 자신이 작성하는 프로그램에 직접 소스코드를 넣어서 레지스트리에 등록하여 Windows가 실행 시 자동으로 실행하게 할 수도 있다.
#include <windows.h>
#include <assert.H>

bool cs_util_register_start_Prog  (const char*  sValue, const char*   sPath)
{
    HKEY hKey;
    DWORD dwDisp;
    DWORD dwSize;

   if( sValue == NULL || sPath == NULL)
   {
       return false;
    }
 
    assert(sValue != NULL);
    assert(sPath != NULL);

    if( RegCreateKeyEx (HKEY_LOCAL_MACHINE,
                                 "Software\\Microsoft\\Windows\\CurrentVersion\\run",
                                 0, NULL,REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
                                 NULL, &hKey, &dwDisp) != ERROR_SUCCESS)
    {
        if(hKey != NULL)RegCloseKey(hKey);
        return false;
    }
     dwSize = strlen(sPath);

    if( RegSetValueEx (hKey, sValue, 0, REG_SZ ,(LPBYTE)sPath, dwSize ) != ERROR_SUCCESS)
    {
        RegCloseKey(hKey);
        return false;
    }

    RegCloseKey(hKey);
    RegFlushKey(hKey);

    return true;
}

....

void main()
{
    cs_util_register_start_Prog("레지스트리에 등록할 이름","등록할 프로그램의 경로");
    // ex) cs_util_register_start_Prog("test_program","c:\\test_program.exe");
    ....
}

대충 이렇게 해서 테스트 해보니.. 위의 루틴을 삽입한 프로그램을 한 번 실행 시키게 되면, 레지스트리에 위의 프로그램이 등록이 되더군...

대략 설치 파일에 이런 부분을 넣으면 편할 듯 하지만, 단순히 실행파일을 시작과 동시에 실행시키기엔 첫번 째 방법이 가장 쉽고 편할듯... ^^;

참고 : http://blog.naver.com/tija98?Redirect=Log&logNo=120037882771