프로그램을 하다보면 가끔 레지스트리를 건드려야만 하는 일이 생기곤한다.
예를들어, 프로그램 시작시 어떤 값을 주고싶다던지 혹은 프로그램 종료시 마지막 설정값을 저장하고 싶다던지...
이럴경우, 간단하게는 화일을 이용할 수 있다.
하지만, 이는 좀 귀찮다.. 그리고, 혹시나 화일이 없어질수도 있다..
하여, Ini라는 설정 파일을 이용할 수도 있다.
이것은 일반 화일을 이용하는것보다는 간편하나 역시나 화일이 없어지면 난감하다..
그래서, 간단하게 무언가 값을 저장하고 싶을때는 레지스트리를 이용하면 편하다.
물론, 레지스트리는 이런 용도 뿐만아니라 프로그램 설치/제거에 관한정보를 담을 수도 있고
다양하게 사용할 수도 있다.
또한, 레지스트리를 이용하면 현재 프로그램 설치목록또한 보여줄수가 있다.
하여, 오늘은 간단히 레지스트리의 값을 읽어오는 방법하고, 설치 프로그램 목록 보여주는 부분을 다루고자 한다.
레지스트리 편집기는 시작-실행에서 "regedit"라고 치면 된다.
그러면, 위와같이 레지스트리 편집기가 뜨는데..
여기에는 크게 Key와 Value로 나눌수 있다.
왼쪽에 폴더모양을 한것이 Key Name이고 오른쪽에 보이는것이 Value Name과 실제 Value(값)이다.
위그림은
HKEY_LOCATION_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall/Windows Media Player라는
키값을 검색한모양이구 오른쪽에 DisplayName이라는 Value Name에 값이 "Windows Media Player 10"으로 되어있는데
바로 이 Uninstall부분을 조회하면 현재 프로그램에 설치된 목록을 알수 있고
저 DisplayName을 조회하면 프로그램 이름을 얻을 수 있다.
물론, 이 Uninstall에 있는 리스트가 실제 설치된 프로그램 목록은 아니다.
하지만, 제어판-프로그램 추가/삭제 에 있는 프로그램 설치 목록보다는 훨씬 더 많은 정보를 가지고 있다.
그것은 프로그램 설치하다가 에러난경우, 혹은 삭제되었지만 레지스트리에는 남아있는경우 등 여러가지 변수가 존재하기
때문이다.
레지스트리 청소기라는 프로그램도 따로 있긴 하지만, 실제 정확하게 프로그램 설치 목록을 구하고자한다면
레지스트리 청소작업이 필요하다. 현재 레지스트리에 남아있는 목록의 경로를 조사해서 실제 프로그램화일이 있는지를
살펴보아야 할것이다.
이부분은 오늘 다루고자 하는 부분과는 좀 거리가 있으므로 넘어가구
이제 실제로 레지스트리에 있는 값을 한번 읽어보자
using Microsoft.Win32;
private RegistryKey regKey;
private void Search_SubKeyNames()
{
string strCurSubKeyName;
strCurSubKeyName = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
regKey = Registry.LocalMachine.OpenSubKey(strCurSubKeyName);
string[] strSubNames = regKey.GetSubKeyNames();
foreach (string s in strSubNames)
{
Console.WriteLine("{0}",s);
}
regKey.Close();
}
레지스트리의 값을 읽는것은 RegistryKey클래스를 이용하면되는데..
using Microsoft.Win32를 해주어야 한다.
먼저, OpenSubKey()로 열고자 하는 키를 정해주어야 하는데
public RegistryKey OpenSubKey (
string name
)
이것이 함수의 원형이다.
Registry.LocalMachine에서 HKEY_LOCATION_MACHINE이부분은 정해진것이므로 그 뒷부분만 적어주면된다.
strCurSubKeyName = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
이렇게 Uninstall키값을 설정하였다.
그후에 GetSubKeyNames()으로 Uninstall키에 딸리 하위 서브키들을 얻어올수있다.
하여, for문돌려서 출력하기만 하면 설치된 프로그램 목록 리스트를 볼수있다.
이것은 Key Name을 얻는 방법이고, 이제 Value Name을 얻어보자
Value Name은 레지스트리 편집기상에서 오른쪽에 있는 부분이다.
하나의 키에는 여러개의 Value Name이 있을수 있다.
프로그래명이라던지 제작일, 실행화일 경로등 많은 설정을 할수있다.
Value Name을 얻는 방법은 다똑같고, GetValueNames()로 얻어 올수있다.
using Microsoft.Win32;
private RegistryKey regValue;
private void Search_ValuesNames()
{
string strCurSubKeyName;
strCurSubKeyName = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Windows Media Player";
regValue = Registry.LocalMachine.OpenSubKey(strCurSubKeyName);
string[] strSubNames = regValue.GetValueNames();
foreach (string s in strSubNames)
{
Console.WriteLine("{0}", s);
}
regValue.Close();
}
위와같이 SubKeyName정해주고 Open()한후에 GetValueNames()로 읽어와서 출력하면 된다.
마지막으로 실제 값을 읽어보자
실제 값은 현재 Value Name을 가지고 GetValue()함수로 얻어올수 있다.
using Microsoft.Win32;
private RegistryKey regValue;
private void Search_Values()
{
string strCurSubKeyName;
strCurSubKeyName = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Windows Media Player";
regValue = Registry.LocalMachine.OpenSubKey(strCurSubKeyName);
string strCurValue;
strCurValue = string.Format("{0}",regValue.GetValue("DisplayName"));
Console.WriteLine(strCurValue);
regValue.Close();
}
역시 비슷하다 Open한후에 GetValue()로 얻어오면 되는데 GetValue()의 인자로 얻어오고자 하는 Value Name을 적어주면
끝이다.
여기서 한가지 주의할점은 실제 값은 정수형이될수도 있고, 문자열이 될수도 있다.
하여, 형변환을 어느것으로 해야할지 잘 모르겠다면 위와같이 string.Format()으로 해두면 된다.
이것이 실제 실행화면이다. 여기에서는 설치프로그램 읽기 버튼을 누를경우 단순히 Key Name만 출력하였는데
여기에서 "DisplayName"부분을 가져오는 코드를 추가하면 설치된 프로그램 목록을 띄워볼수 있을듯하다.
여기에서 실제 서브키의 개수는 SubKeyCount()로 구할수 있는데.. 252개나 된다.
살펴보니 Windows업데이트 화일들도 다 포함된듯 하다...
암튼, 오늘은 간단하게 레지스트리를 읽어와서 표시하는것 까지 해보았는데..
CreateSubKey, DeleteSubKey, SetValue, DeleteValue들의 함수들을 이용하면 새로이 Key나 Value를 생성, 삭제할수도 있다