从注册表中读取字符串值会产生一些垃圾字符

时间:2016-02-18 12:52:01

标签: c# c++ registry

我使用以下代码从注册表中读取值。该值由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必须包含终止空字符或字符的大小。

我不确定导致问题的原因。

1 个答案:

答案 0 :(得分:1)

_tcslen返回字符串中的字符数,因此如果TCHAR定义为wchar_t(即与UNICODE一起使用),则长度计算需要一个整个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