2017-09-01 49 views
3

我有一个读取和写入注册表文件的程序,以便记住窗口位置等。这对于仅仅是管理员而言非常简单,但当您仅仅是一名用户时就非常简单系统。每个用户的注册表值

我使用高级安装程序,如果你有任何很酷的建议。

  1. 应该在哪里定位注册参数,以便每个用户都可以使用我的应用程序和他们自己的注册表值?
  2. 该路径是否足够通用,以便程序可以找到该文件夹​​而不会遇到问题?

编辑/更新:

问题1:你在哪里放东西,如果不是在HKEY_CURRENT_USER?

答:当我把这些文件放在HKEY_CURRENT_USER下时,它只会把它放在那个用户下面。因此,如果我要以管理员身份安装程序,那只有该用户拥有这些文件。由于我使用的是高级安装程序,因此我不确定这是否属于某些设置值。

声明1,从波格丹Mitrache: 如果你愿意,你也可以利用从Windows安装程序的自我修复支持(高级安装也支持),让安装程序写入HKCU下的默认设置为每个用户启动应用程序,即使由管理员安装。这里是一个文件的例子,但它也适用于注册表:advancedinstaller.com/user-guide/qa-self-healing.html

回应:这是一个很好的解决方案,除了我有条件安装的问题。用户可以选择安装其中一个或另一个功能,他们都使用这些注册表值。这可能是为什么它不适合我。我将在AI中以逻辑意义来复制文件。

+1

如果不在'HKEY_CURRENT_USER'中,你会把东西放在哪里? – molbdnilo

+0

也许你应该使用HKCU而不是HKLM – Federico

+0

当我把这些文件放在HKEY_CURRENT_USER下时,它只会把它放在那个用户下面。因此,如果我要以管理员身份安装程序,那只有该用户拥有这些文件。由于我使用的是高级安装程序,因此我不确定这是否属于某些设置值。 – 413X

回答

1

来处理这个正确的方法是存储默认值(例如,在安装过程中)在HKEY_LOCAL_MACHINE(如果有的话),再后来存储在HKEY_CURRENT_USER用户特定值。

当应用程序需要读取值时,首先检查HKEY_CURRENT_USER,如果没有找到,则检查HKEY_LOCAL_MACHINE(或使用硬编码的默认值)。

当应用程序需要存储的值,其存储只有在HKEY_CURRENT_USER

是的,这是否意味着,如果你的应用是由一个管理员身份运行,在默认情况下它会读取来自管理员的键的值,并存储在管理的关键价值。这完全没问题,因为管理员当时是该应用的用户。如果应用程序由非管理员运行,则值将相对于该用户。

在应用程序运行作为管理员用户,但需要读取/存储在其他用户的HKEY_CURRENT_USER键的值的情况(例如,当一个非管理员用户登录到Windows和应用程序与UAC运行使用其他用户的登录)标高,然后应用程序可以通过打开其他用户的HKEY_CURRENT_USER关键:

  • 冒充其他用户,然后使用RegOpenCurrentUser()

  • 使用LoadUserProfile()加载其他用户的配置文件,该配置文件返回加载的用户的HKEY_CURRENT_KEY密钥(除其他之外)的句柄。

如果要访问其他用户的HKEY_CLASSES_ROOT键代替HKEY_CURRENT_USER,您可以使用RegOpenUserClassesRoot()