본문 바로가기
Study/API

CSIDL의 값과 그 사용 방법

by 뿡뿡대마왕 2011. 9. 23.
반응형

우리가 프로그램을 짜다보면 윈도우의 특정경로를 얻어와야 하는 경우가 있다.
뭐 API함수 없이도 구해올 수 있지만 그러면 상당히 귀찮아진다. 
그래서 찾다보니 SHGetSpecialFolderLocation 함수와  SHGetPathFromIDList 함수를 이용해 윈도우의 특정 경로를
취득할 수 있다.
예를 들면 휴지통 경로,  윈도우 임시파일 저장 경로, 쿠키가 저장된 경로등. 다양한 경로를 쉽게 얻어올 수 있다.

함수 원형을 보면 다음과 같다.

HRESULT SHGetSpecialFolderLocation(

  __in   HWND hwndOwner,

  __in   int nFolder,                            //여기서 CSIDL이란 값이 들어가는데 그값에 따라 특정경로를 취득한다.

  __out  PIDLIST_ABSOLUTE *ppidl

);

//위에서 얻어오는 PCIDLIST_ABSOLUTE 값을 넣어면 실제 경로가 튀어 나온다...ㅋㅋ

BOOL SHGetPathFromIDList(

  __in   PCIDLIST_ABSOLUTE pidl,

  __out  LPTSTR pszPath

);


자 함수는 위와 같이 생겻고 함수의 자세한 인자 설명은 MSDN에 잘나와 있다
SHGetSpecialFolderLocation  :   http://msdn.microsoft.com/en-us/library/bb762203(VS.85).aspx 
 
 

SHGetPathFromIDList : http://msdn.microsoft.com/en-us/library/bb762194(VS.85).aspx
  


윈도우즈쉘은 식별하기 위해서 폴더간에 PIDL이라는 값을 사용한다고 한다.
PIDL은 형태상으로는 ITEMLIST라는 구조체포인터로 선언되어 있는데 자세히는 잘 모르겠다.;
암튼 SHGetSpecialFolderLocation함수로 pidl을 구하고
구해진 pidl을 가지고 특정 경로를 취득할 수 있는것이다.
pidl을 가지고 특정 경로를 취득하는 함수는 SHGetPathFromIDList 함수가 되는 것이다. 



자 그럼 CSIDL에 대해 함 봅시다!!
<표 출처: http://blog.naver.com/PostView.nhn?blogId=sobakmt&logNo=60058711792&widgetTypeCall=true>

CSIDL 

의미

0x0000 (CSIDL_DESKTOP)

「데스크탑」(네임 스페이스의 루트를 나타내는 가상 폴더)

0x0001 (CSIDL_INTERNET)

Internet Explorer(가상 폴더)

0x0002 (CSIDL_PROGRAMS)

「프로그램」(파일 시스템 디렉토리)

0x0003 (CSIDL_CONTROLS)

「컨트롤 패널」(가상 폴더)

0x0004 (CSIDL_PRINTERS)

「프린터」(가상 폴더)

0x0005 (CSIDL_PERSONAL)

「마이 문서」(파일 시스템 디렉토리)

0x0006 (CSIDL_FAVORITES)

「마음에 드는 것」(파일 시스템 디렉토리)

0x0007 (CSIDL_STARTUP)

「스타트 업」(파일 시스템 디렉토리)

0x0008 (CSIDL_RECENT)

「최근 사용한 파일」(파일 시스템 디렉토리)

0x0009 (CSIDL_SENDTO)

SendTo(파일 시스템 디렉토리)

0x000a (CSIDL_BITBUCKET)

「쓰레기통」(가상 폴더)

0x000b (CSIDL_STARTMENU)

「스타트 메뉴」(파일 시스템 디렉토리)

0x000d (CSIDL_MYMUSIC)

「마이 뮤직」(파일 시스템 디렉토리)

0x0010 (CSIDL_DESKTOPDIRECTORY)

「데스크탑」상의 파일 오브젝트를 격납하는 폴더(파일 시스템 디렉토리)

0x0011 (CSIDL_DRIVES)

「마이 컴퓨터」(가상 폴더)

0x0012 (CSIDL_NETWORK)

「네트워크 컴퓨터」(가상 폴더)

0x0013 (CSIDL_NETHOOD)

NetHood(파일 시스템 디렉토리)

0x0014 (CSIDL_FONTS)

Fonts(폰트를 포함한 가상 폴더)

0x0015 (CSIDL_TEMPLATES)

문서 템플릿이 격납되는 폴더(파일 시스템 디렉토리)

0x0016 (CSIDL_COMMON_STARTMENU)

AllUsers 의 「스타트 메뉴」(파일 시스템 디렉토리)

0x0017 (CSIDL_COMMON_PROGRAMS)

AllUsers 의 「프로그램」(파일 시스템 디렉토리)

0x0018 (CSIDL_COMMON_STARTUP)

AllUsers 의 「스타트 업」(파일 시스템 디렉토리)

0x0019 (CSIDL_COMMON_DESKTOPDIRECTORY)

AllUsers 의 「데스크탑」(파일 시스템 디렉토리)

0x001a (CSIDL_APPDATA)

Version 4.71 이후: 「Application Data(파일 시스템 디렉토리)

0x001c (CSIDL_LOCAL_APPDATA)

Version 5.0 이후: 「Application Data(파일 시스템 디렉토리)

0x001d (CSIDL_ALTSTARTUP)

비지방판의 「스타트 업」(파일 시스템 디렉토리)

0x001e (CSIDL_COMMON_ALTSTARTUP)

비지방판의 AllUsers 의 「스타트 업」(파일 시스템 디렉토리)

0x001f (CSIDL_COMMON_FAVORITES)

AllUsers 의 「마음에 드는 것」(NT계만)(파일 시스템 디렉토리)

0x0020 (CSIDL_INTERNET_CACHE)

Version 4.72 이후: 인터넷 일시파일을 격납하는 폴더(파일 시스템 디렉토리)

0x0021 (CSIDL_COOKIES)

Cookies(파일 시스템 디렉토리)

0x0022 (CSIDL_HISTORY)

「이력」(파일 시스템 디렉토리)

0x0023 (CSIDL_COMMON_APPDATA)

Version 5.0 이후: AllUsers 의 「Application Data(파일 시스템 디렉토리)

0x0024 (CSIDL_WINDOWS)

Version 5.0 이후: Windows 디렉토리

0x0025 (CSIDL_SYSTEM)

Version 5.0 이후: Windows System 디렉토리

0x0026 (CSIDL_PROGRAM_FILES)

Version 5.0 이후: Program Files 폴더

0x0027 (CSIDL_MYPICTURES)

Version 5.0 이후: My Pictures 폴더(파일 시스템 디렉토리)

0x0028 (CSIDL_PROFILE)

Version 5.0 이후: profile 폴더

0x002b (CSIDL_PROGRAM_FILES_COMMON)

Version 5.0 이후;Windows 2000/XP Program Files\Common

0x002d (CSIDL_COMMON_TEMPLATES)

Windows NT/2000/XP AllUsers 의 문서 템플릿이 격납되는 디렉토리

0x002e (CSIDL_COMMON_DOCUMENTS)

Shfolder.dll AllUsers 의 문서 템플릿이 격납되는 디렉토리(Windows NT 계 및 Shfolder.dll 하지만 인스톨 되었다Windows 9x)

0x002f (CSIDL_COMMON_ADMINTOOLS)

Version 5.0 이후: AllUsers 의 관리툴 디렉토리

0x0030 (CSIDL_ADMINTOOLS)

Version 5.0 이후: 관리툴 디렉토리

[출처] CSIDL 값의 의미|작성자 소백촌닭

위에 나와 있는 CSIDL값을 넣어주면 해당 경로가 나온다.
 
어떻게 넣어주느냐 .?? 자 아래 예제를 첨부 하겠다.
 


LPITEMIDLIST lpi;

HRESULT hRrt;
TCHAR Temp[MAX_PATH]={0,};
hRrt = SHGetSpecialFolderLocation(NULL, CSIDL_PROFILE,&lpi);   //여기서는 CSIDL_PROFILE을 넣어줌

if(hRrt == S_OK) //! 성공일때

{

bGetPath = SHGetPathFromIDList(lpi,Temp);

if(bGetPath) 

{
             //Temp 버퍼안에는 해당 경로가 들어있다..ㅋㅋㅋ 

}
}


참 쉽죠잉??


 
반응형

댓글