Author: Not specified Language: cpp
Description: Not specified Timestamp: 2013-06-17 17:07:41 +0000
View raw paste Reply
  1. //typedef HRESULT (WINAPI * GETKNOWNFOLDERPATH)( const GUID & rfid, DWORD dwFlags, HANDLE hToken, PWSTR *ppszPath );
  2. //const GUID FOLDERID_SavedGames_IdTech3 = { 0x4c5c32ff, 0xbb9d, 0x43b0, { 0xb5, 0xb4, 0x2d, 0x72, 0xe5, 0x4e, 0xaa, 0xa4 } };
  3. typedef HRESULT (WINAPI * GETFOLDERPATH)(HWND, int, HANDLE, DWORD, LPSTR);
  4. char    *Sys_DefaultHomePath(void) {
  5.         TCHAR szPath[MAX_PATH];
  6.         memset( szPath, 0, MAX_PATH );
  7.  
  8. #if 0
  9.         HMODULE shelldll = LoadLibrary("shell32.dll");
  10.  
  11.         if(shelldll)
  12.         {
  13.                 GETKNOWNFOLDERPATH qSHGetKnownFolderPath = (GETKNOWNFOLDERPATH)GetProcAddress(shelldll, "SHGetKnownFolderPath");
  14.  
  15.                 if(qSHGetKnownFolderPath)
  16.                 {
  17.                         wchar_t * path;
  18.                         if( SUCCEEDED( qSHGetKnownFolderPath( FOLDERID_SavedGames_IdTech3, CSIDL_FLAG_CREATE | CSIDL_FLAG_PER_USER_INIT, 0, &path ) ) ) {
  19.                                 if(wcstombs( szPath, path, MAX_PATH ) > MAX_PATH)
  20.                                 {
  21.                                         szPath[0] = 0;
  22.                                 }
  23.                                 CoTaskMemFree( path );
  24.                         }
  25.                 }
  26.                 FreeLibrary(shelldll);
  27.         }
  28.  
  29.         if(szPath[0] != '\0')
  30.         {
  31.                 Com_sprintf(homePath, sizeof(homePath), "%s%c", szPath, PATH_SEP);
  32.  
  33.                 if(com_homepath->string[0])
  34.                         Q_strcat(homePath, sizeof(homePath), com_homepath->string);
  35.                 else
  36.                         Q_strcat(homePath, sizeof(homePath), HOMEPATH_NAME_WIN);
  37.                 return homePath;
  38.         }
  39. #endif
  40.  
  41.         HMODULE shfolder = LoadLibrary("shfolder.dll");
  42.  
  43.         if(shfolder == NULL)
  44.         {
  45.                 Com_Printf("Unable to load SHFolder.dll\n");
  46.                 return NULL;
  47.         }
  48.  
  49.         if(!*homePath && com_homepath)
  50.         {
  51.                 GETFOLDERPATH qSHGetFolderPath = (GETFOLDERPATH)GetProcAddress(shfolder, "SHGetFolderPathA");
  52.                 if(qSHGetFolderPath == NULL)
  53.                 {
  54.                         Com_Printf("Unable to find SHGetFolderPath in SHFolder.dll\n");
  55.                         FreeLibrary(shfolder);
  56.                         return NULL;
  57.                 }
  58.  
  59.                 if( !SUCCEEDED( qSHGetFolderPath( NULL, CSIDL_PERSONAL | CSIDL_FLAG_CREATE,
  60.                                                 NULL, SHGFP_TYPE_CURRENT, szPath ) ) )
  61.                 {
  62.                         Com_Printf("Unable to detect CSIDL_PERSONAL\n");
  63.                         FreeLibrary(shfolder);
  64.                         return NULL;
  65.                 }
  66.                
  67.                 Com_sprintf(homePath, sizeof(homePath), "%s%cMy Games%c", szPath, PATH_SEP, PATH_SEP);
  68.  
  69.                 if(com_homepath->string[0])
  70.                         Q_strcat(homePath, sizeof(homePath), com_homepath->string);
  71.                 else
  72.                         Q_strcat(homePath, sizeof(homePath), HOMEPATH_NAME_WIN);
  73.         }
  74.  
  75.         FreeLibrary(shfolder);
  76.         return homePath;
  77. }
View raw paste Reply