【问题标题】:Administrator rights request管理员权限请求
【发布时间】:2010-02-01 07:07:51
【问题描述】:

如果我不以“管理员身份”运行我的程序,则会出现错误 访问冲突 ...在模块中...等...

尝试使用我的 ini 文件时出错。 如何避免错误或请求管理员权限。

(使用 C++Builder6 ,但 Delphi 代码对我来说也是可读的)

默认使用 ini

TIniFile *FormCllient;
        FormCllient = new TIniFile(ExtractFilePath(Application->ExeName)+"Inf\\MyIniFile.ini");
...

添加:

我想我需要在安装应用程序后为文件夹添加规则 我使用 Inno Setup 制作安装包...希望这是真的。

*****添加:*****

如何将我的文件放入应用数据中?

【问题讨论】:

    标签: delphi windows-vista c++builder vcl


    【解决方案1】:

    除非你真的必须/,否则不要将 ini 文件放在应用程序中/。普通用户,即使是管理员/当应用程序未明确提升/无权写入 Program Files 文件夹。 如果要编写可供所有用户访问的 ini,请使用 environment var %ProgramData%,如果要编写只能由当前用户访问的用户特定数据,请使用 env var %USERPROFILE%\AppData\Roaming。 您也可以使用“SHGetFolderPath”通过 API 获取这些文件夹。

    【讨论】:

    • "%USERPROFILE%\AppData\Roaming" 在 WinXP 中会有点难看。 SHGetFolderPath 要好得多。
    【解决方案2】:

    这是我编写的一个函数,用于在 C++Builder 中获取 Application Data 文件夹。

    如果您使用的是旧版本的 C++Builder,您可能会发现您必须将其更改为使用 AnsiStrings 而不是 Unicode(将“UnicodeString”替换为“AnsiString”,并更改致电“SHGetSpecialFolderPathW”阅读“SHGetSpecialFolderPath”)。

    GetAppDataFolder.h:

    #ifndef GetAppDataFolderH
    #define GetAppDataFolderH
    
    UnicodeString GetAppDataFolder(bool roaming = true);
    
    #endif
    

    GetAppDataFolder.cpp:

    // Helper function to get the location of the current user's Application Data folder (used for
    // storing per-user application settings).
    
    #include <vcl.h>
    #pragma hdrstop
    
    
    /*  roaming:    True for application data that can be accessed by the same user on different
                    machines. If you have per-user settings that are only relevant to a particular
                    computer, e.g., screen resolution, set 'roaming' to false.
    */
    UnicodeString GetAppDataFolder(bool roaming /* = true */)
    {
        UnicodeString retVal;
        int csidl = roaming ? CSIDL_APPDATA : CSIDL_LOCAL_APPDATA;
        wchar_t thePath[MAX_PATH];
        if (SHGetSpecialFolderPathW(NULL, thePath, csidl, 0) == TRUE) {
            retVal = thePath;
        }
        return retVal;
    }
    

    【讨论】:

      【解决方案3】:

      尝试对其进行硬编码,访问冲突可能来自向系统询问有关用户可能或可能没有权限知道的文件的信息。如果您需要更动态的解决方案,请尝试使用引用文件位置或用户“主”文件夹的环境变量

      【讨论】:

      • 我想我需要将我的 ini 文件移动到 {localappdata} 本地(非漫游)应用程序数据文件夹的路径。
      【解决方案4】:

      有什么理由/反对将您的应用配置存储在注册表中?我不是建议你重做提出问题的代码,只是对我自己未来的项目感到好奇。

      【讨论】:

        猜你喜欢
        • 2011-09-19
        • 2014-02-08
        • 2021-07-27
        • 2013-01-20
        • 2018-05-01
        相关资源
        最近更新 更多