我使用以下代码从注册表中读取值。该值由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 :(得分: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