우리가 프로그램을 짜다보면 윈도우의 특정경로를 얻어와야 하는 경우가 있다.
뭐 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 버퍼안에는 해당 경로가 들어있다..ㅋㅋㅋ
}
}
참 쉽죠잉??
'Study > API' 카테고리의 다른 글
레지스터 데이터 입력 및 삭제... (0) | 2011.09.28 |
---|---|
바탕화면 새로고침~~ F5 함수!~ (0) | 2011.09.28 |
폴더 복사 방법 (0) | 2011.09.28 |
SHGetSpecialFolderPath를 이용하여 특수 경로를 구하기 (0) | 2011.09.28 |
CreateProcess로 실행한 프로세스의 종료 시점 알기~ (0) | 2011.09.28 |
댓글