2014-09-23 16 views
0

我最近遇到了RegSetValueEx(來自advapi32.dll)的問題。它看起來像使用RegistryKey.GetValue()在.net 4.5中正確讀取.Net 4.5中的該方法保存的REG_SZ。插圖如下:.Net 4.5 vs .Net 3.5 RegSetValueEx返回一堆空字符

//---.Net 3.5--- (no issues) 
Call RegSetValueEx() to save base64 string value "ajG8s" to the registry 
Call RegistryKey.GetValue() on that value returns "ajG8s" 

//---.Net 4.5--- (no issues) 
Call RegSetValueEx() to save base64 string value "ajG8s" to the registry 
Call RegistryKey.GetValue() on that value returns "ajG8s" 

//---.Net 3.5 & .Net 4.5--- (issues) 
Call RegSetValueEx() to save base64 string value "ajG8s" to the registry (in .Net 3.5) 
Call RegistryKey.GetValue() on that value returns "ajG8s\0\0\0\0\0\6\A\z./,'./Z?" (in .Net 4.5) 

上面的例子中的代碼是100%相同的 - 只需切換.Net 4.5版本。

最初我以爲也許正在寫入註冊表的字符串不是正確的空終止 - 它是。我也證實,如果我嘗試使用RegistryKey.SetValue()寫入值,則不會發生這種情況 - 只有RegSetValueEx(來自advapi32.dll)似乎會導致此行爲。

現在最簡單的解決方案是簡單地搜索返回的字符串(4.5)中的第一個空終止字符並刪除字符串的其餘部分。該解決方案有效,但我寧願找出問題的根源。

什麼是造成它的任何想法?非常感謝!

+2

請出示你在註冊表中看到的值,你已經執行的任何診斷,以確定準確* *你要在.NET中檢索 - 目前我們沒有太多可以說的。 – 2014-09-23 06:06:10

+0

用更好的信息重寫了這個問題,現在我知道問題到底是什麼:) – Ross 2014-10-06 05:08:50

+0

它不是100%清除「保存base64字符串值」的含義 - 是將它保存爲字符串還是你將它保存爲字節?你爲什麼使用'RegSetValueEx'呢?註冊表顯示什麼? – 2014-10-06 06:16:09

回答

0

我已經意識到實際的問題了。實際的問題是由於我們錯誤地將base64字符串寫入到使用WinApi的註冊表中引起的。RegSetValueEx() - 傳入的length屬性過高,導致一堆垃圾正在寫入註冊表。

實際的問題被揭露,因爲(假定)的變化:

RegistryKey.GetValue() 
的.Net 3.5和4.5之間

。 .Net 3.5將在第一個'\ 0'字符上終止GetValue(),.Net 4.5 GetValue()會繼續讀取,直到......某個點。這就是爲什麼我'責備'.Net - 而這是我們的代碼,是責怪!仍然 - 對節點的一個有趣的變化。

希望這有助於其他人有類似的問題:)

+0

不知道爲什麼答案downvoted。誠然,問題出在您的代碼中。但是你的回答突出了.NET 3.5和.NET 4.5之間的兼容性問題,這很好理解。 – davidbak 2014-10-22 20:36:45

+0

我也這麼認爲!好吧 :( – Ross 2014-10-30 21:49:26