2016-02-18 131 views
0

我正在使用以下代碼從註冊表中讀取值。該值由C++應用程序寫入註冊表。我面臨的問題是,從C#應用程序讀取的值具有一些終止垃圾字符。如果我手動將字符串寫入註冊表,則在C#中讀取的值是正確的。從註冊表中讀取字符串值會產生一些垃圾字符

string strPath = "SOFTWARE\\SUKHAS\\TEST\\"; 
string strName = "ActiveLayoutName"; 

try 
{ 
    using (RegistryKey regKeyExt = Registry.CurrentUser.OpenSubKey(strPath)) 
    { 
     if (regKeyExt != null) 
     { 
      string strLayoutName = ""; 
      object obj = regKeyExt.GetValue(strName, strLayoutName); 

      LayoutName = obj as string; 
     } 
    } 
} 
catch (Exception ex) 
{ 
} 

將值寫入註冊表的主要C++代碼。

DWORD len = (DWORD)((_tcslen(lNewValue) * sizeof(TCHAR)) + 1); 
//Does this cause problem? +1? if I remove the +1, I am not getting the junk character in C# application. 

result = RegSetValueEx(hResultKey, lpRegSzName, 0, REG_SZ, (LPBYTE)lNewValue, len); 

RegCloseKey(hResultKey); 

任何線索?這是因爲這個問題導致問題的長度爲+1

作爲每函數RegSetValueEx的文檔,

的信息的大小所指向的lpData參數,以字節爲單位。如果數據類型爲REG_SZ,REG_EXPAND_SZ或REG_MULTI_SZ,則cbData必須包含終止空字符的大小。

我不確定是什麼導致了問題。

+0

什麼是TCHAR,char或wchar_t? – Niall

+1

你想'(_tcslen(lNewValue)+ 1)* sizeof(TCHAR)'。 – molbdnilo

+0

爲什麼我會在c#應用程序中看到垃圾字符? – Sukhas

回答

1

_tcslen返回字符串中的字符數,因此,如果TCHAR是(即,具有UNICODE正在使用)定義爲wchar_t,則長度計算需要一個整體wchar_t(用於NUL)來獲得長度正確(counting in the terminating null) 。

DWORD len = static_cast<DWORD>((_tcslen(lNewValue)+1) * sizeof(TCHAR)); 
//             ^^ add 1 for the wchar_t NUL 
+0

我的問題是關於在從c#app讀取字符串時獲取垃圾字符 – Sukhas

+0

如果您首先寫入垃圾,那麼它會讀取垃圾。我認爲長度計算(要寫入的字節數)不正確。 – Niall

+0

哈哈,,我爲什麼要寫垃圾字符串?我寫了適當的字符字符串..沒有垃圾字符...和你的友善的信息,如果我從C++應用程序從註冊表中讀取相同的字符串,我沒有看到任何垃圾字符...我面臨的問題在C#應用程序閱讀 – Sukhas

相關問題