我正在考虑为应用程序添加可配置的设置,我认为最简单的方法是外部文件或赢注册表(它是一个赢只应用程序)。应用程序设置方法? C++
哪种方式会更好?
我想知道,没有足够权限的用户可能无法创建/写入配置文件。而在注册表的情况下,今天防病毒允许我添加/编辑/删除密钥?或者他们只监视某些键?另外,如果有人知道类/ lib来管理vC++中的配置设置(在纯win32中),请发布它。
我正在考虑为应用程序添加可配置的设置,我认为最简单的方法是外部文件或赢注册表(它是一个赢只应用程序)。应用程序设置方法? C++
哪种方式会更好?
我想知道,没有足够权限的用户可能无法创建/写入配置文件。而在注册表的情况下,今天防病毒允许我添加/编辑/删除密钥?或者他们只监视某些键?另外,如果有人知道类/ lib来管理vC++中的配置设置(在纯win32中),请发布它。
据我所知:
没有足够权限的用户可能无法创建/写配置文件
你应该能够让内部用户的“家庭档案目录“或”应用程序数据“目录,无论权限如何。通常这些目录应该是可写的。
将今天的杀毒软件允许我添加/编辑/删除密钥?
从未见过我的杀毒软件会干扰注册表操作。只要你没有在注册表中做任何可疑的事情,你可能会好起来的。
哪种方式会更好?
是味道的问题。我认为文本文件更好 - 可以更轻松地迁移设置。只是不要在卸载后留下垃圾。
另外,如果有人知道一个类/ lib目录来管理VC配置设置++
中的Qt 4。但使用Qt的全部只是保存设置QSettings绝对是矫枉过正。你也可以检查JSON等配置语言,使用lua进行设置(比使用Qt 4更少矫枉过正)或者获取任何XML库。另外,直接使用注册表或使用iostreams或stdio编写配置文件不应该很难。如果你喜欢它,你可以随时编写自己的配置库。
我认为新的默认设置是在用户的文件夹下的用户的“AppData”文件夹中写入一个配置文件,该文件夹应该可以安全地读/写。
我们使用一个简单的XML格式文件来存储设置;但您可以使用INI文件类型格式。
如果您将配置文件保存在应用程序数据目录SHGetFolderPath()
与CSIDL_COMMON_APPDATA
中,所有用户将能够看到配置。如果您使用CSIDL_LOCAL_APPDATA
,则只有一个用户能够看到配置。注册表不一定是保存所有配置数据的地方。
“仅限Windows”是限制还是限制解除?如果你不介意跨平台,那么我建议你给boost::program_options
一试。该库通过命令行,通过环境变量和INI文件支持程序选项。 Boost的program_options
也很好地集成和粘贴了各种解析器与variables_map
,您可以将它们视为选项及其值之间的映射。
对于简单的东西,你可能只是使用注册表。但是,配置文件有很多优点...您可以针对应用程序的不同用途保存/加载多个不同的配置,在用户或计算机之间共享或迁移设置更加简单等。
如果您最终去文件路径,我会建议Boost的属性树库:
http://www.boost.org/doc/libs/1_41_0/doc/html/property_tree.html
它有一个相当不错的语法:
boost::property_tree::ptree properties;
std::string name = properties.get<std::string>("blah.name");
int score = properties.get<int>("blah.score");
properties.put("blah.name", "Inverse");
properties.put("blah.score", 1000);
它还支持读取和写入各种格式,如XML和其他。
+1:“我认为文本文件更好 - 允许更轻松地迁移设置”对于生产应用程序,这是非常重要的考虑因素。可以导出和导入注册表配置单元,但用户通常不会得到这些信息,而且您可能不希望他们混淆注册表 – 2010-05-27 16:33:13
这还取决于您要使用的语言。纯C++不提供注册表支持。阅读和编写文本文件都很困难。是的,你可以轻松地打开它们,但是如果你有大量的设置需要处理,解析和寻找值将成为PITA。 如果你有访问Win32/MFC/COM等,我会强烈建议去注册表。读取/写入操作非常简单,只需要几行代码。封装在一个类中,你有一个非常优雅的可重用解决方案。 – Justin 2010-05-27 16:39:07