系统启动时,我有一个正在加载的Windows服务及其系统和用户进程。在加载用户进程(作为管理员)之后,我调用QueryDisplayConfig来检查显示特定信息。问题在于,有时只有QueryDisplayConfig返回的值既不是可能的返回值。
解决方法是在调用QueryDisplayConfig以打开和关闭Windows注册表之前。它很有趣但不知何故它修复了一些事情。我想知道regedit.exe是什么导致Windows更新注册表。
这个问题可能没有解决方案,我不得不采用以下解决方案,这也是一个解决方案:
LONG lResult = QueryDisplayConfig(QDC_DATABASE_CURRENT, &PathArraySize, PathArray.data(), &ModeArraySize, ModeArray.data(), &CurrentTopology);
while (lResult != ERROR_SUCCESS &&
lResult != ERROR_INVALID_PARAMETER &&
lResult != ERROR_NOT_SUPPORTED &&
lResult != ERROR_ACCESS_DENIED &&
lResult != ERROR_GEN_FAILURE &&
lResult != ERROR_INSUFFICIENT_BUFFER)
{
Sleep(300);
lResult = QueryDisplayConfig(QDC_DATABASE_CURRENT, &PathArraySize, PathArray.data(), &ModeArraySize, ModeArray.data(), &CurrentTopology);
}
我宁愿不采用这种丑陋的解决方法,并以编程方式更新/刷新注册表。
答案 0 :(得分:1)
如果我关闭/重新打开REGEDIT,那么当我通过REGEDIT搜索注册表时,我会得到不同的结果,如果我不这样做的话。这是在WS08R2上。我原以为这是REGEDIT本身的一个问题。现在听起来像是一个可能的Windows bug。如果是这样的话就不会有任何漂亮的解决方法。
基于Windows Internals,注册表在内存中运行。所以任何值/键的查询都将始终来自内存。如果值/键当前不在内存中,则首先读取它,但读取后的代码路径与已经在内存中的代码路径相同。不应该是on disk hive比内存中的hive部分更新的情况。
所以"清爽"基于文档化的设计,注册表确实没有意义。因此,我不希望有一个API来刷新"。
我认为这样做最不丑的方式(取决于你的审美观)是试图模仿REGEDIT的作用。当你关闭它时,它会保存最后一次在注册表中浏览的位置,所以下次你运行REGEDIT时,它将(至少)打开并读取任何荨麻疹,按键和&填写REGEDIT的窗口是必要的。
因此,您可以在下次从QueryDisplayConfig
获得意外值时运行REGEDIT并查看哪些键和&正在显示值。然后将其编入您的程序。你实际上不必显示当然的值,但只是打开&读他们。