13

我有一个相当大的 C++ 应用程序(在 Windows 上,没有计划其他平台),它当前将所有设置(甚至某种地址)存储在 Windows 注册表中。

有时这很不方便,因为用户很难更改注册表中的条目。我希望设置版本化,因此设置始终与当前代码匹配。目前我们对 reg 文件进行版本控制,但您永远无法确定是否所有 reg 文件都已添加到目标机器上。使用 C#,您可以在 app.config 中定义默认值,但不要覆盖现有设置。我不知道 C++ 是否存在这样的机制或库。

我想拥有以下“功能”:

  • 设置可以版本化
  • 目标机器上的简单更新(可由用户完成)
  • 确保在更新时仅添加新设置,并且不使用默认值覆盖现有设置
  • 为用户简单更改设置
  • Win XP 和 Win 7 下的工作流程相同

据我所知,在 Windows 上存储设置有 3 种可能性:

  • 登记处
  • .ini文件
  • XML 文件

目前我们套件中只有一个应用程序使用 Qt,但 Boost 将可用。

对于地址,我们会将它们放在某种 XML 通讯簿中,但对于其他设置,我们不确定,最好的做法是什么。

4

1 回答 1

6

正如评论所提到的,基于树的键/值结构是一种常见的解决方案,并且库很容易找到。

Boost 的 property_tree是一个很好的选择,因为它经过充分测试并且可以轻松导出为 XML 或 JSON

关于您的要求:

  • 设置可以版本化

是的!使“版本”成为顶级键。使其易于与其他版本进行比较。

您还可以将您的设置分类到各种树节点中,并为每个节点提供一个版本。

  • 目标机器上的简单更新(可由用户完成)

让您的应用程序在运行时执行此操作。见下文。

  • 确保在更新时仅添加新设置,并且不使用默认值覆盖现有设置
  • 为用户简单更改设置
  • Win XP 和 Win 7 下的工作流程相同

随着设置从一个版本更改为另一个版本,这些更改通常分为三类。需要新属性,放弃旧设置,并且某些设置会更改其预期格式。例如,“32 华氏度”变为“0 摄氏度”

当您的应用程序初始化时:

  • 加载现有配置文件,无论其版本如何。
  • 如果版本与应用程序的当前版本不匹配:
    • 为新配置创建一个新的空白属性树
    • 对于树中的每个节点,如果旧文件的树中不存在该设置,则具有一组预期的属性名称和一个函数指针或类似的获取此设置。如果一个设置改变了它的格式,给它一个新的名字。
    • 在旧树中搜索每个设置,如果找到则复制它,如果没有则使用提供的函数的结果。
    • 保存新的设置文件。

您的“缺失设置”功能可以:

  • 返回一个常量默认值。
  • 查询树以获取不同的设置并将其转换(如果也找不到旧设置,则使用默认值)
  • 询问用户
于 2012-06-28T00:54:48.360 回答