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

本文关键字:字符 注册表 读取 字符串 | 更新日期: 2023-09-27 18:35:08

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

我不确定是什么导致了问题。

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

_tcslen返回字符串中的字符数,因此如果TCHAR定义为wchar_t(即与 UNICODE 一起使用),则长度计算需要一整wchar_t(对于 NUL)才能获得正确的长度(计入终止 null)。

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