윈도우 32비트 프로그래밍 46 |
안녕하세요..........돌팔이 황동준입니다................... 이번시간 부터는 레지스트리에 대한 것에 대해 알아 보겠습니다. 혹시 레지스트리라는것을 들어 그러나 레지스트리에 설치된 디렉토리를 저장할 수 있는 기능은 있죠. 바로 레지스트리에도 너무 서론이 길었죠? 그렇다면 이러한 레지스트리를 어떻게 원하는데로 바꿀 수 있을까요? 한번 실행해 보세요. 어때요? 크게 6개의 폴더가 보이죠? 각 커다란 폴더에는 의미가 있습니다. HKEY_CLASSES_ROOT 이 하위에 있는 정보들은 문서의 형태, 파일연관상태에 대한 정보가 들어 있습니다. 실제로 HKEY_CURRENT_USER 각각 사용자에 따른 사용자 정보를 가지고 있습니다. HKEY_LOCAL_MACHINE 하드웨어, 네트워크, 소프트웨어 정보가 이곳에 있습니다. 실제로 프로그램이 설치되어 있는 HKEY_USERS 각각 사용자에 대한 시스템 정보를 가지고 있습니다. HKEY_CURRENT_CONFIG 하드웨어 설정에 대한 정보값이 들어 있습니다. HKEY_DYN_DATA 역시 하드웨어적인 정보값이 들어 있습니다. 자 각각에 대해 알아 보았으니 각 서브 폴더를 확인해 보시기 바랍니다. 폴더 옆에 보면 어때요? 네임에 어떤 이름이 있고 데이터에 값이 들어 있죠? 물론 아무 값도 가지지 않는 자 새로운 용어를 알아 봅시다. 우리가 앞에서 언급한 폴더를 키라고 합니다. 각 키는 물론 자 이제부터 우리는 기존에 등록되어 있는 키, 네임, 데이터를 읽는 것을 프로그램 상으로 그러면 시작해 봅시다. 먼저 등록되어 있는 정보를 읽어오는 방법부터 알아 봅시다. 처음에 정보를 가져올 키가 어떤 LONG RegOpenKeyEx( 위 함수를 이용해서 레지스트리에 설정되어 있는 키를 열 수 있습니다. 첫번째 파라미터에 제일 HKEY_CLASSES_ROOT 두번째 파라미터에는 우리가 정보를 가져올 서브키를 지정해 주면 됩니다. 서브키 내에 또다른 KEY_ALL_ACCESS 아래 모든 예약어를 마지막 파라미터에는 서브키를 열었을때 얻어진 키 핸들을 저장할 변수의 주소를 지정해 주면 자 이제 서브키를 열었으니 그 키가 가지는 데이터를 가져오기만 하면 될 겁니다. LONG RegQueryValueEx( 위 함수를 이용해서 데이터를 가져올 수 있습니다. 첫번째 파라미터에는 위 그리고 다섯번째 파라미터에는 읽어온 데이터가 저장될 주소를 지정하면 됩니다. 마지막 데이터를 읽어오는 과정이 어렵지 않죠? 키를 열어서 작업을 다 했으면 그 키를 닫아 주어야 LONG RegCloseKey( 위 함수를 이용해서 연 키를 닫을수 있습니다. 물론 새로 생성한 키도 위 함수를 이용해서 그러면 이번에는 정보를 기록하는 방법에 대해 알아 봅시다. 마찬가지로 어렵지 않습니다. 먼저 LONG RegCreateKeyEx( 첫번째 파라미터에는 제일 상단에 있는 루트키를 지정해 주면 되는데 이 루트키는 이미 REG_OPTION_VOLATILE 메모리에만 첫번째 예약어를 사용하게 되면 메모리에만 저장되므로 시스템이 재시작되면 무효가 되나 두번째 여섯번째 파라미터에는 어세스 옵션을 지정해 주면 되는데 다음과 같은 예약어를 지정해 주면 KEY_ALL_ACCESS 아래 모든 예약어를 앞에서 알아본 RegOpenKeyEx()함수의 예약어와 같죠? 일곱번째 파라미터에는 이제 키를 생성하는 함수를 알아보았으니 원하는 네임에 데이터를 지정하는 함수를 알아 LONG RegSetValueEx( 위 함수를 이용해서 원하는 네임과 데이터를 지정해줄수 있는데 각 파라미터의 의미를 알아 첫번째 파라미터에는 RegCreateKeyEx()함수로 얻은 키 핸들을 지정해주면 되고 REG_BINARY 바이너리 형태입니다. 다섯번째 파라미터에는 데이터를 지정해주면 됩니다. 마지막 파라미터에는 데이터의 길이를 지정해 자 그러면 이번에는 키를 삭제하는 방법을 알아 봅시다. 먼저 지울 키를 RegOpenKeyEx()함수를 이용해서 핸들 형태로 반환을 받아야 합니다. 원하는 네임의 데이터를 지울 때에는 아래 함수를 사용하면 됩니다. LONG RegDeleteValue( 첫번째 파라미터에 지울 네임이 속해 있는 키의 핸들을 지정해 주면 됩니다. 두번째 이번에는 키 자체를 없애는 함수입니다. LONG RegDeleteKey( 첫번째 파라미터에는 최상위 루트 키의 이름을 지정해주면 되고 두번째 파라미터에는 그 안에 자 그러면 위에서 배운 함수들을 이용해서 실제로 프로그램을 만들어 봅시다. 오늘은 여기까지 |
윈도우 32비트 프로그래밍 47 |
안녕하세요........돌팔이 황동준입니다................. 이번시간에는 저번시간에 알아 본 함수들을 이용해서 프로그램을 만들어 보겠습니다. 아래 프로그램은 레지스트리에 원하는 키를 생성해서 거기에 데이터를 기록한 뒤 실제로 그 MyMenu MENU #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, return msg.wParam; LRESULT CALLBACK switch(message) switch(LOWORD(wParam)) if(!SetRegistry()) case 200 : strcpy(szBuff, case 300 : DeleteRegistry(); case WM_DESTROY : PostQuitMessage(0); BOOL SetRegistry(void) lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE, char* GetRegistry(void) lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, void DeleteRegistry(void) RegOpenKeyEx(HKEY_LOCAL_MACHINE, 자 프로그램을 실행시켜 첫번째 메뉴 아이템인 Set Registry를 선택해 보세요. 그리고 제가 만든 세개의 함수 루틴만 보면 되겠네요. BOOL SetRegistry(void) 이 함수는 새로운 키를 생성하는 역할을 합니다. HKEY hKey; lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE, HKEY_LOCAL_MACHINE 부분에 있는 Software내에 DORAN 20이라는 키를 if(lRet != ERROR_SUCCESS) 성공적으로 함수가 수행되면 ERROR_SUCESS라는 리터값이 발생된다는 것을 위 구문으로 lRet = RegSetValueEx(hKey, "Install", NULL, Install이라는 네임에 c:doran20이라는 데이터를 저장하는 구문입니다. if(lRet != ERROR_SUCCESS) 역시 함수가 성공적으로 수행되면 ERROR_SUCCESS라는 리턴값이 발생되는군요. RegCloseKey(hKey); 생성한 키를 닫는 구문입니다. return TRUE; char* GetRegistry(void) 이 함수는 원하는 서브키의 데이터를 가져오는 역할을 합니다. HKEY hKey; lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 데이터를 가져올 서브키를 열고 있습니다. if(lRet != ERROR_SUCCESS) Install이라는 네임에 해당하는 데이터를 가져오고 있습니다. if(lRet != void DeleteRegistry(void) 이 함수는 첫번째 메뉴 아이템에 의해 생성된 키와 데이터를 삭제하는 역할을 합니다. HKEY hKey; RegOpenKeyEx(HKEY_LOCAL_MACHINE, 지울 키를 얻고 있습니다. RegDeleteValue(hKey, "Install"); Install 네임을 가지고 있는 데이터를 삭제하는 구문입니다. RegDeleteKey(HKEY_LOCAL_MACHINE, 서브 키를 없애는 구문입니다. RegCloseKey(hKey); 오늘은 여기까지 |
윈도우 32비트 프로그래밍 48 |
안녕하세요............돌팔이 황동준입니다............... 이번시간에도 레지스트리에 대해 더 알아 보겠습니다. 이번에 알아 볼 것은 어떤 키에 속해있는 먼저 크게 두단계로 나누어서 합니다. 첫번째 단계는 바로 원하는 키에 서브키가 몇개 있는지 자 그러면 실제로 어떤 식으로 구현하는지 필요한 함수를 보도록 합시다. 먼저 서브키의 개수를 LONG RegQueryInfoKey ( 첫번째 파라미터로 RegOpenKeyEx()함수에서 얻은 키 핸들을 지정하면 됩니다. 두번째 네번째 파라미터에는 0을 지정하면되고 다섯번째 파라미터인 lpcSubKeys에는 서브키의 여덟번째 파라미터인 lpcValues에는 지정해준 키에 대한 데이터의 개수가 저장 될 변수의 아홉번째 파라미터에는 가장 긴 네임에 대한 길이가 저장될 변수의 주소를 지정해주면 되고 자 서브키나 데이터의 개수를 위 함수로 알아 냈으니 이번에는 실제로 그 서브키나 데이터가 LONG RegEnumKeyEx( 바로 위 함수를 이용해서 알아 낼 수 있습니다. 첫번째 파라미터에 알아낼 서브키가 속해있는 세번째 파라미터에는 해당하는 인텍스의 서브키가 들어갈 버퍼를 지정해 주면 되고 네번째 다섯번째 파라미터에는 NULL을 지정해 주면 되고 여섯번째 파라미터에는 클래스 이름이 저장될 마지막 파라미터는 설명 드릴필요는 없겠군요. 앞의 RegQueryInfoKey() 함수의 자 그러면 실제로 이것을 이용한 프로그램을 만들어 봅시다. 아래 프로그램은 새로운 MyMenu MENU #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, return msg.wParam; LRESULT CALLBACK switch(message) switch(LOWORD(wParam)) if(!SetRegistry()) case 200 : if(!PrintSubRegistry(hWnd)) case WM_DESTROY : PostQuitMessage(0); BOOL SetRegistry(void) lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE, if(lRet != BOOL PrintSubRegistry(HWND hWnd) lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, ; 오늘은 여기까지 |
윈도우 32비트 프로그래밍 49 |
안녕하세요.............돌팔이 이번시간에는 저번시간에 만든 프로그램을 분석해 보겠습니다. 제가 만든 두개의 함수만 알아 보면 되겠죠? BOOL SetRegistry(void) 이 함수는 우리가 어떤 서브키가 있는지 테스트해보기 위해 임시로 서브키를 만드는 기능을 HKEY hKey; lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE, 어떤 서브키를 만드는지 굳이 설명드릴 필요는 없죠? 바로 Install이라는 서브키를 만들고 lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE, if(lRet != 앞에서 만든 DORAN 20이라는 서브키에 다시 Version이라는 서브키를 생성하고 네임에 } 앞에서 한부분이므로 이해가 안가는 부분은 없을 겁니다. 위 함수가 수행되면 DORAN BOOL PrintSubRegistry(HWND hWnd) 이 함수는 DORAN 20 서브키에 속해 있는 서브키를 찾아서 화면에 출력해주는 역할을 HDC hDC; lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, if(lRet != ERROR_SUCCESS) 알아 볼 서브키가 포함되어 있는 부모 키를 여는 구문입니다. lRet = RegQueryInfoKey(hKey, NULL, 0, 0, 이번에 알아 볼것은 단지 서브키의 개수이므로 데이터의 개수가 저장될 파라미터에는 NULL을 if(lRet != 서브키의 개수만큼 인덱스를 증가하기 위해 위 dwCount라는 변수를 사용하였습니다. do 인덱스에 해당하는 서브키를 얻고 있는 구문입니다. dwSubKeySize = 80; 위 함수가 수행되면 dwSubKeySize에 실제 크기가 저장되므로 이 값을 다시 hDC = GetDC(hWnd); 얻은 서브키를 화면에 출력해 주는 구문입니다. dwCount++; 인덱스를 증가하고 있습니다. } while(dwCount<dwSubKeyNumber); 서브키의 개수만큼 루프문을 돌고 있습니다. RegCloseKey(hKey); 자 그러면 이번에는 좀더 진보적인 프로그램을 만들어 봅시다. 바로 서브키만 알아내는 것이 MyMenu MENU #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, int WINAPI WinMain WndClass.style = hWnd = ShowWindow(hWnd, while(GetMessage(&msg, NULL, 0, return msg.wParam; LRESULT CALLBACK switch(message) switch(LOWORD(wParam)) if(!SetRegistry()) case 200 : if(!PrintSubRegistry(hWnd)) case WM_DESTROY : PostQuitMessage(0); BOOL SetRegistry(void) lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE, if(lRet != BOOL PrintSubRegistry(HWND hWnd) lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lRet = RegQueryInfoKey(hSubKey, NULL, 0, 0, } 오늘은 여기까지 |
윈도우 32비트 프로그래밍 50 |
안녕하세요..............돌팔이 황동준입니다............. 이번시간에는 저번시간에 만든 프로그램을 분석해 보겠습니다. 이번에는 함수 하나만 알아보면 되겠네요. BOOL PrintSubRegistry(HWND hWnd) lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 정보를 알아볼 서브키의 루크키를 여는 구문입니다. lRet = RegQueryInfoKey(hKey, NULL, 0, 0, if(lRet != 서브키의 개수를 알아내고 있습니다. dwCount = 서브키를 알아내고 있는 구문입니다. dwSubKeySize = lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 알아낸 서브키를 열고 있는 구문입니다. lRet = RegQueryInfoKey(hSubKey, NULL, 0, 0, 그 서브키가 가지는 데이터의 개수를 얻고 있습니다. dwValueCount = 데이터의 개수만큼 루프문을 반복하고 있습니다. RegEnumValue(hSubKey, dwValueCount, 위 함수로 인덱스에 해당하는 네임과 데이터를 얻을 수 있는데 위에서 이 함수에 대해 LONG RegEnumValue( 첫번째 파라미터에는 얻을 네임이 포함되어 있는 서브키의 핸들을 지정해 주면됩니다. 두번째 REG_BINARY 그 의미는 이미 앞에서 설명드렸을 겁니다. 일곱번째 파라미터에는 데이터가 저장될 버퍼를 지정하면 되고 마지막 파라미터에는 이 버퍼의 함수 설명을 했으니 계속해서 해당 루틴을 알아 보도록 하겠습니다. dwNameSize = dwValueSize = 80; 역시 길이를 초기화 해주고 있습니다. sprintf(szPrint, "%s : %s", szName, 얻은 네임과 데이터를 화면에 출력해 주고 있습니다. dwValueCount++; 네임에 대한 인덱스를 증가해주고 있습니다. } 서브키에 대한 인덱스를 증가해주고 있습니다. } while(dwCount<dwSubKeyNumber); 서브키의 개수만큼 루프문이 돌고 있습니다. RegCloseKey(hKey); 오늘은 여기까지 |