访问 Windows 注册表时设置字符串缓冲区的大小

Setting Size of String Buffer When Accessing Windows Registry

我正在开发一个 VBScript Web 应用程序,该应用程序有一个新引入的要求,即与注册表对话以提取连接字符串信息,而不是使用硬编码字符串。由于这会引入开销,我正在进行性能分析,并注意到在 Process Monitor 中读取值 returns 两个 BUFFER OVERFLOW 结果,然后最终返回成功。

在线查看,Mark Russinovich posted about this topic 几年前,表明由于不知道注册表项的大小,因此使用了 144 字节的默认缓冲区。由于有两个缓冲区溢出响应,整个调用所花费的时间大约翻了一番(是的,我意识到差异是 40 微秒,但是每秒 1,000 或更多页面点击,我愿意投入一些时间在优化中)。

我的问题是:有没有办法在 WMI 尝试获取注册表值之前告诉它它的大小?这是我用来访问注册表的代码示例:

svComputer = "." ' Local machine is simply "."
ivHKey = &H80000002 ' HKEY_LOCAL_MACHINE = &H80000002 (from WinReg.h)
svRegPath = "SOFTWARE\Path\To\My\Values"

Set oRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}!\" & svComputer & "\root\default:StdRegProv")
oRegistry.GetStringValue ivHKey, svRegPath, "Value", svValue

在 VBScript 中,字符串是字符串。他们需要多长时间。您不预先定义它们的长度。此外,如果性能对您来说是一个很大的问题,您应该考虑使用编译语言而不是解释语言(或您之前读取的值的缓存)。