BOOL TSHGetSpecialFolderPathV(HWND hWnd, void *str, int flg, BOOL is_create) { static BOOL (WINAPI *pSHGetSpecialFolderPath)(HWND, void *, int, BOOL); if (!pSHGetSpecialFolderPath) { pSHGetSpecialFolderPath = (BOOL (WINAPI *)(HWND, void *, int, BOOL)) ::GetProcAddress(::GetModuleHandle("shell32"), IS_WINNT_V ? "SHGetSpecialFolderPathW" : "SHGetSpecialFolderPathA"); } return pSHGetSpecialFolderPath ? pSHGetSpecialFolderPath(hWnd, str, flg, is_create) : FALSE; }
BOOL GetPresetDir(LPTSTR pszPath) { #if defined(_WIN32_WCE) && _WIN32_WCE < 300 _tcscpy(pszPath, _T("\\My Documents")); #elif defined(_WIN32_WCE) SHGetSpecialFolderPath(NULL, pszPath, CSIDL_PERSONAL, FALSE); #else // win32 GetModuleFileName(GetInst(), pszPath, MAX_PATH); LPTSTR p = _tcsrchr(pszPath, _T('\\')); if (p) *p = NULL; // SHGetSpecialFolderPathがない環境 (WinNT4 SP6 without IE4) // のユーザーから苦情がきたため // こんなことしなくてもよいのでは? (古い環境に対応していてはきりがない) BOOL (WINAPI *pSHGetSpecialFolderPath)(HWND hwndOwner, LPTSTR lpszPath, int nFolder, BOOL fCreate) = NULL; HINSTANCE hInstDll = (HINSTANCE)LoadLibrary(_T("shell32.dll")); if (hInstDll) { #ifdef _UNICODE #ifdef _WIN32_WCE (FARPROC&)pSHGetSpecialFolderPath = GetProcAddress(hInstDll, _T("SHGetSpecialFolderPathW")); #else (FARPROC&)pSHGetSpecialFolderPath = GetProcAddress(hInstDll, "SHGetSpecialFolderPathW"); #endif #else (FARPROC&)pSHGetSpecialFolderPath = GetProcAddress(hInstDll, _T("SHGetSpecialFolderPathA")); #endif if (pSHGetSpecialFolderPath) pSHGetSpecialFolderPath(NULL, pszPath, CSIDL_PERSONAL, FALSE); FreeLibrary(hInstDll); } #endif if (_tcslen(pszPath) + _tcslen(PRESET_DIR) + 2 > MAX_PATH) return FALSE; _tcscat(pszPath, _T("\\")); _tcscat(pszPath, PRESET_DIR); if (GetFileAttributes(pszPath) == 0xFFFFFFFF) CreateDirectory(pszPath, NULL); return TRUE; }