从注册表中读取字符串值会给出一些垃圾字符
本文关键字:字符 注册表 读取 字符串 | 更新日期: 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