기존 XP에서는 SHGetFolderPath 함수를 이용하면 가능했지만 Vista에서는 SHGetKnownFolderPath 함수를 사용해야 한다. 아직 Compatibility를 위해서 기존 함수도 지원한다고 하지만 Recommand가 아니니 바꿔야 잠재된 문제를 앱앨 수 있겠죠.소스 1.
if (_isVista) { WCHAR *pSavePath = NULL; HMODULE shell32module = GetModuleHandle("shell32.dll"); // Defined in the platform SDK for Vista const DWORD KF_FLAG_CREATE = 0x00008000; const GUID FOLDERID_LocalAppData ={0xF1B32785, 0x6FBA, 0x4FCF, {0x9D, 0x55, 0x7B, 0x8E, 0x7F, 0x15, 0x70, 0x91}}; SHGetKnownFolderPathProc SHGKFPfunction = reinterpret_cast<SHGetKnownFolderPathProc>( GetProcAddress(shell32module, "SHGetKnownFolderPath")); HRESULT hr = SHGKFPfunction(FOLDERID_LocalAppData, KF_FLAG_CREATE, NULL, &pSavePath); }[/CODE] 소스 2. [CODE]#include <strsafe.h> typedef UINT (CALLBACK* LPFNDLLFUNC)(GUID& rfid,DWORD dwFlags,HANDLE hToken,PWSTR* ppszPath); TCHAR pathBuf[MAX_PATH] = _T(""); HRESULT hr; size_t len; PWSTR path = NULL; HINSTANCE hInst; LPFNDLLFUNC pGetKnownFldpathFnPtr; // Vista에서 "사용자/AppData/Local" 경로에 대한 GUID값 // {0xA520A1A4, 0x1780, 0x4FF6, {0xBD, 0x18, 0x16, 0x73, 0x43, 0xC5, 0xAF, 0x16}} <-- LocalLow GUID FOLDERID_LocalAppData = { 0xF1B32785, 0x6FBA, 0x4FCF, {0x9D, 0x55, 0x7B, 0x8E, 0x7F, 0x15, 0x70, 0x91} }; hInst = LoadLibrary( _T("shell32.dll") ); pGetKnownFldpathFnPtr = ( LPFNDLLFUNC )GetProcAddress( hInst, "SHGetKnownFolderPath" ); if ( pGetKnownFldpathFnPtr && SUCCEEDED(pGetKnownFldpathFnPtr(FOLDERID_LocalAppData, 0, NULL, &path)) ) { hr = StringCchLengthW( path, STRSAFE_MAX_CCH, &len ); if ( SUCCEEDED(hr) ) { #ifndef _UNICODE WideCharToMultiByte( CP_ACP, 0, path, len, pathBuf, MAX_PATH, NULL, NULL ); #endif StringCchPrintf( szPath, MAX_PATH, _T("%s"), pathBuf ); } CoTaskMemFree( path ); } FreeLibrary( hInst );
FOLDERID의 GUID는 MSDN이나 Vista SDK의 헤더 파일을 보시면 나와 있어요.
KnownFolderID에 대한 MSDN 문서 : http://msdn.microsoft.com/en-us/library/bb762584.aspx