CString::Replace无法使用注册表中的值



我正在尝试实现一些需要更改注册表中值的东西,在注册表中,我要删除和添加的内容只能在运行时决定。我的测试代码:

CString test_string, change_from, change_to;
test_string.Format(_T("Communications Port (COM1)"));
change_from.Format(_T("COM1"));
change_to.Format(_T("COM2"));
test_string.Replace(change_from, change_to);
MessageBox(test_string, _T("Test"), MB_OK);

如预期工作。

但是当从注册表填充testrongtring和change_from时,它不会。

CRegKey serenum_key;
serenum_key.Open(HKEY_LOCAL_MACHINE, _T("System\CurrentControlSet\services\Serenum\Enum"), KEY_READ);
CRegKey sysenum_key;
sysenum_key.Open(HKEY_LOCAL_MACHINE, _T("System\CurrentControlSet\Enum"), KEY_READ);
DWORD count = 0;
serenum_key.QueryDWORDValue(_T("Count"), count);
CString keyname, keypath, friendlyname, portname;
const ULONG max_len = 256;
ULONG len;
keypath.Preallocate(max_len);
friendlyname.Preallocate(max_len);
portname.Preallocate(max_len);
for (DWORD i = 0; i < count; i++) {
keyname.Format(_T("%d"), i);
len = max_len;
serenum_key.QueryStringValue(keyname, keypath.GetBuffer(), &len);
CRegKey dev_key;
dev_key.Open(sysenum_key, keypath.GetBuffer(), KEY_READ);
len = max_len;
dev_key.QueryStringValue(_T("FriendlyName"), friendlyname.GetBuffer(), &len);
CRegKey devparams_key;
devparams_key.Open(dev_key, _T("Device Parameters"), KEY_READ);
len = max_len;
devparams_key.QueryStringValue(_T("PortName"), portname.GetBuffer(), &len);
ATLTRACE(friendlyname);
ATLTRACE(portname);
CString newname;
newname.Format(_T("COM%d"), 50);
ATLTRACE(newname);
friendlyname.Replace(portname, newname);
ATLTRACE(friendlyname);
devparams_key.Close();
dev_key.Close();
}
sysenum_key.Close();
serenum_key.Close();
}

我得到的跟踪显示了我希望从注册表项和新名称中看到的内容,但友好名称保持不变:

Communications Port (COM1)
COM1
COM50
Communications Port (COM1)

为什么Replace在第一个实例中工作,但在注册表键值中不工作?值得注意的是,我正在与visual studio社区2017合作,平台工具集v141,Unicode,x64

CString::GetBuffer的文档解释了如何使用这个类成员:

如果使用GetBuffer返回的指针来更改字符串内容,则在使用任何其他CSimpleStringT成员方法之前,必须调用ReleaseBuffer

如果不这样做,则CString对象的内部状态无效。当您需要将非CString字符串数据附加到CString实例时,类成员的GetBuffer/ReleaseBuffer家族非常有用。前者暂时禁用类不变量,而后者重新建立它们,因此它们总是需要同时调用。

最新更新