2015-06-26 25 views
0

我正在研究一個VBScript Web應用程序,該應用程序有一個新引入的要求,與註冊表進行通信,以便使用硬編碼字符串來提取連接字符串信息。我正在執行性能分析,因爲這會引入開銷,並且在Process Monitor中發現讀取該值會返回兩個BUFFER OVERFLOW結果,然後才能最終返回成功。訪問Windows註冊表時設置字符串緩衝區的大小

Registry Work

尋找在線,Mark Russinovich posted about this topic在幾年前,這表明由於註冊表項的大小是不知道,則使用144個字節的默認緩衝區。由於存在兩個緩衝區溢出響應,整個調用所花費的時間大約增加了一倍(是的,我意識到差異是40微秒,但每秒有1000或更多頁面點擊,我願意投入一些時間在優化中)。

我的問題是:有沒有辦法告訴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 
+0

根據文章,它會影響任何reg值> 132個字節。你可以縮短連接字符串還是查找DSN? :) – Bond

+0

不幸的是,@Bond,我無法對連接字符串本身的長度做任何事情。如果沒有辦法設置緩衝區大小,那麼我已經考慮過這樣的路由(將最易變/保密的位保存在註冊表中,並將它與其餘的連接在一起) - 這只是比我想要的更混亂的解決方案。 – mgw854

回答

2

在VBScript中,字符串是字符串。然而,他們需要長久。你沒有預先定義它們的長度。另外,如果性能對你來說是一個問題,你應該考慮使用編譯的而不是解釋型語言(或者緩存來讀取之前讀取的值)。

+0

問題不在於VBScript字符串,而在於WMI GetStringValue使用緩衝區將值從註冊表中讀取出來。 此外,我完全同意更改平臺和緩​​存,但這是遺留系統的最後剩餘部分,既不是選項。 – mgw854

+0

VBScript不知道什麼(也不能訪問)'GetStringValue'實現的內部工作。所以,答案仍然是:沒有辦法。 –