以编程方式锁定注册表项以避免并发问题

Lin*_*986 3 c# c++ winapi

我正在编写一个应用程序,需要按特定顺序在密钥内写入注册表值,并且其他应用程序可能会同时写入同一密钥。

有没有办法暂时锁定注册表项以进行写入,以避免多个进程同时写入该注册表项,以及值变得混乱/无序?

例如,我需要写入HKCU\Software\Company\Product\其中已包含以下值:

  • Start1="abc"
  • Start2="def"
  • Start3="ghi"

因为最后一个是Start3,我需要创建Start4

问题是,如果另一个进程同时运行,检测到这Start3是最后一个进程,并覆盖我Start4刚刚创建的进程(因为由于并发而没有看到它)。

有什么好方法可以防止这种情况发生?

我无法控制哪些(或多少)应用程序正在写入此键,因此我无法告诉它们暂停或类似的事情......

我正在寻找类似下面的伪代码的东西:

Registry.Lock("HKCU\Software\Company\Product\");
Registry.Write("Start4", "jkl");
Registry.Unlock("HKCU\Software\Company\Product\");
Run Code Online (Sandbox Code Playgroud)

Lin*_*986 5

不幸的是,看来我要回答我自己的问题了。

写入和删除注册表数据

在写入操作期间无法锁定注册表项以 同步对数据的访问。但是,您可以使用安全属性控制对注册表项的访问。有关详细信息,请参阅 注册表项安全和访问权限

可以在单个事务中执行多个注册表操作。要将注册表项与事务关联起来,应用程序可以使用RegCreateKeyTransactedRegOpenKeyTransacted 函数。有关事务的更多信息,请参阅内核事务管理器

来自:https://learn.microsoft.com/en-us/windows/win32/sysinfo/writing-and-deleting-registry-data