가끔 이런게 필요할떄가 있습니다.
" 레지스트리 특정 키 위치 아래를 뒤져서 하위 키들 목록을 좀 알고 잡다."

이런건 이렇게 쓰일떄가 가장 큰 이유일 거라 생각되지요.
" 설치된 프로그램들 목록을 알고 싶을때 ... "
" USB 장치들 목록을 알고 싶을때 ... "
" PCI 장치들 목록을 알고 싶을떄 ... "

후자 두가지는 사실 시스템 레지스트리 보다는 사용중인 리소스를 보고 판단해야 하겠지만, 이런 부분은 어셈블러나 드라이버부분이 함께 연동이 되어야 하는 이유로 어려움이 따를수 밖에 없는 부분 입니다.

하지만, 가장 좋은건 지금 설치된 프로그램이나 , 설치 제거가 가능한 프로그램들 목록을 검색할떄 이런걸 사용한다면 참 좋을것이라는 생각이 듭니다.

다음은 제가 구현한 코드 입니다.
들어가는 인자는 각각 다음과 같습니다.

HKEY hUserKety - 이것은 HKEY_LOCAL_MACHINE , HKEY_CLASSES_ROOT 를 말합니다.
PSTRING 은 typedef 로 정의된 char * 의 정의이다.
PSTRING SubKey 는 서브키 입니다. 예를 들면 ..SOFTWARE\SK Communications 를 말합니다.
PSTIRING FindName 은 서브키 안에 들어 있는 목록의 이름 입니다.
보통 설치 삭제 정보에 들어 있는 정보들중 공통 요소는 DisplayName 입니다.
PSTRING FindValue 는 FindName에 해당하는 값 입니다. 네이트온의 경우 "네이트온" 이 되겠죠.
PSTRING FoundPath 는 실제 찾은 서브키의 전체 경로 입니다.

이 코드는 같은 이름을 가지는 여러 코드를 찾기 보다는 , 첫번째로 찾은 동일한 키 정보를 바로 리턴 하게 됩니다.
이런경우 코드의 목적은 순환을 돌면서 해당 키를 삭제할때에 어울리게 됩니다.

실제 네이트온의 설치 정보를 찾을때엔 이렇게 됩니다.
 if (RegFindFromKey(HKEY_LOCAL_MACHINE,
                    "software\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
                    "DisplayName",
                    "네이트온",
                     szBuf))
실제 software\Microsoft\Windows\CurrentVersion\Uninstall 내엔 여러 서브키들이 다양한 이름으로 존재 합니다.
특히 네이트온은 설치 CLSID (클래스 ID) 로 설치 되므로 해당 PC 마다 다른 값을 갖게 됩니다.
그럼으로 위와 같은 코드로 여러 위치들 내에 존재하는 값으로 설치된 전체 서브키 를 구하게 되는 것 입니다.

찾게되면 함수의 return 은 TRUE(1) 이 되며 , szBuf 안에는 원하는 정보가 든 키의 문자열이 들어가게 됩니다.

Posted by 견족자K rageworx