본문 바로가기

Programming/Win32&MFC&COM

특수한 폴더의 경로를 알아오기

반응형

Windows를 사용하다보면, 특수한 폴더들이 몇 군데 있습니다.

일단 대표적인 게 Windows가 설치된 폴더, System 폴더가 있습니다.

바탕화면 폴더, 폰트 폴더 등도 특수한 폴더에 속합니다.

이러한 폴더 주소는 사용자마다 다를 수 있기 때문에 프로그래밍시에 직접 넣는 것은 위험할 수 있습니다.

쉘 함수 중에 이런 특수한 폴더의 경로를 알아내는 함수가 존재합니다.

HRESULT SHGetSpecialFolderLocation(HWND hwndOwner, int nFolder, PIDLIST_ABSOLUTE *ppidl)

SHGetSpecialFolderLocation() 라는 함수입니다.

첫 번째 인자는 미래를 위해서 예약된 인자이므로 NULL을 넣어줍니다.

두 번째 인자가 가장 중요한 부분인데 원하는 폴더가 어떤 것인지를 적는 부분입니다.

세 번째 부분은 결과를 받기 위해서 전달합니다.

함수의 사용은 다음과 같이 가능합니다.

#include <ShlObj.h>
#include <iostream>

int main()
{
	LPITEMIDLIST itemList = nullptr;
	wchar_t szPath[MAX_PATH] = {0, };

	SHGetSpecialFolderLocation(nullptr, CSIDL_PROGRAM_FILESX86, &itemList);
	SHGetPathFromIDListW(itemList, szPath);

	CoTaskMemFree(itemList);

	std::wcout << "\""<< szPath << "\"" << std::endl;
	
	return 0;
}

간단하게 사용이 가능합니다.

LPITEMIDLIST 변수를 사용한 이후에는 CoTaskMemFree로 반드시 메모리 해제를 해줘야 합니다.

두 번째 인자에 원하는 폴더의 ID를 입력하면 경로를 획득할 수 있습니다.

특수한 폴더의 경로를 정확하게 획득하고자 할 때 사용하면 됩니다.

이 함수를 포함하는 SHGetFolderLocation()이라는 함수도 존재합니다.

반응형