'RegCreateKeyEx'에 해당되는 글 2건
- 2009.05.29 레지스트리(Registry)
- 2008.08.19 Windows 프로그램을 시작 프로그램으로 등록하기
2009. 5. 29. 15:43
레지스트리(Registry)
2009. 5. 29. 15:43 in Programmings/Windows Programming
프로그램은 실행중에 사용자가 입력한 옵션 설정이나 프로그램 스스로 만들어낸 정보들을 다음 실행을 위해서 저장을 해두어야 할 필요가 있다. 레지스트리(Registry)는 프로그램 실행중에 일어나는 상황이라든지 프로그램의 설정 정보를 저장하기 위해 사용된다. 저장의 대상은 사용자의 신상, 프로그램의 위치, 크기, 옵션, 설정 등의 프로그램 동작에 필요한 모든 정보가 될 수 있다.
이러한 레지스트리 설정을 통해 프로그램이 다음 실행시에도 이전의 상태 그대로를 유지 할 수 있는 것을 볼 수 있다.
등록된 레지스트리를 보거나 수정을 하려면 시작->실행에서 regedit를 입력후 엔터키를 치면 확인할 수 있다.
레지스트리를 다루는 데 주로 사용되는 함수들은 아래와 같다.
레지스트리 키를 생성하는 함수이다. 이미 키가 생성되어 있는 상태라면 해당 키를 열기만 한다. 이 함수의 인수는 9개로 많기는 하지만, 대부분의 인수는 디폴트로 적용된다.
RegCreateKeyEx ( HKEY_CURRENT_USER, "Software\\Wizntec\\RegiTest\\Position", 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &dwDisp );
RegCreateKeyEx()에 의해 열려진 레지스트리 키는 아래의 RegSetValueEx()함수를 통해서 조작할 수 있다.
RegCreateKeyEx()에 의해 오픈된 레지스트리로부터 RegQueryValueEx()를 사용해서 값을 읽어올 수 있다.
RegOpenKeyEx() 함수는 레지스트리를 열기만 하는 함수이다. 보통 RegCreateKeyEx()를 주로 이용하여 잘 사용되지 않는 함수이다.
마지막으로 열려진 레지스트리 키를 닫는 함수이다.
레지스트리의 예제는 윈도우즈 API 정복을 참조했으며 아래 파일을 통해 테스트 하면 된다.
이러한 레지스트리 설정을 통해 프로그램이 다음 실행시에도 이전의 상태 그대로를 유지 할 수 있는 것을 볼 수 있다.
등록된 레지스트리를 보거나 수정을 하려면 시작->실행에서 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 : 기존의 키가 오픈된 것
예)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 - 데이터의 크기 값
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 - 이 변수의 크기값을 가지는 변수의 번지
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
);
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 프로그램을 시작 프로그램으로 등록하기
2008. 8. 19. 16:56 in Programmings/Windows Programming
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");
....
}
#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
'Programmings > Windows Programming' 카테고리의 다른 글
Windows Power management API - PBT_APMPOWERSTATUSCHANGE Event (1) | 2008.09.05 |
---|---|
GetCurrentDirectory()를 이용한 Windows에서 현재경로 받아오기.. (1) | 2008.08.20 |
GetMessage() 와 PeekMessage() (1) | 2008.08.11 |
Windows Device Driver 관련 용어들.. (0) | 2008.07.31 |
MSDN 키보드 입력 작동 방식 스크랩 (0) | 2008.07.28 |