14

我的应用程序需要安装一些可以在运行时由应用程序编辑的文件。Install shield 提供了一个别名 [CommonAppDataFolder],它将在 Vista 和 Windows 7 上解析为 c:\programData,并且也适用于 Windows XP。是否有将返回类似路径的 win32 函数?

也许我需要根据操作系统调用不同的函数?

4

2 回答 2

22

SHGetFolderPath/SHGetSpecialFolderPath得到你,有CSIDL_COMMON_APPDATA论据。

请参阅此处的代码片段(在底部):如何使用 Visual C++ 编写将用户和应用程序数据存储在正确位置的 Windows XP 应用程序;原始链接不再有效 - 代码片段被拉到下面):

include <shlwapi.h>
#pragma comment(lib,"shlwapi.lib")
void CreateTemporaryFile()
{
   TCHAR szPath[MAX_PATH];
   // Get path for each computer, non-user specific and non-roaming data.
   if ( SUCCEEDED( SHGetFolderPath( NULL, CSIDL_COMMON_APPDATA, 
                                    NULL, 0, szPath ) ) )
   {
      TCHAR szTempFileName[MAX_PATH];
      // Append product-specific path - this path needs to already exist
      // for GetTempFileName to succeed.
      PathAppend( szPath, _T("\\My Company\\My Product\\1.0\\") );
      // Generate a temporary file name within this folder.
      if (GetTempFileName( szPath, 
                           _T("PRE"),
                           0,
                           szTempFileName ) != 0 )
      {
         HANDLE hFile = NULL;
         // Open the file.
         if (( hFile = CreateFile( szTempFileName, 
                                   GENERIC_WRITE, 
                                   0, 
                                   NULL, 
                                   CREATE_ALWAYS, 
                                   FILE_ATTRIBUTE_NORMAL, 
                                   NULL )) != INVALID_HANDLE_VALUE )
         {
            // Write temporary data (code omitted).
            CloseHandle( hFile );
         }
      }
      else
          DWORD err = GetLastError();
   }
}
  • Windows XP:C:\Documents and Settings\所有用户\应用程序数据
  • Windows Vista:C:\ProgramData
  • Windows 7:C:\ProgramData

另请参阅:CSIDL

于 2012-06-25T19:41:02.387 回答
2

自 Delphi XE5以来,此功能是框架的一部分。

  • 单元:System.IOUtils
  • 班级:TPath
  • 功能:GetPublicPath

有关更多信息,请参阅embarcadero docwiki

于 2019-07-21T19:01:53.353 回答