Vista에서 알려진 경로를 구하는 방법…

기존 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

Related Posts

답글 남기기

이메일 주소는 공개되지 않습니다.