CString :: Заменить не работает со значениями из реестра - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь реализовать что-то, где мне нужно изменить значения в реестре, где то, что я удаляю и что я добавляю, определяется только во время выполнения.мой тестовый код:

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);

работает, как и ожидалось.

, но когда test_string и 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();
}

следы I 'я получаю показ того, что я ожидаю увидеть из раздела реестра и нового имени, но понятное имя остается неизменным:

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

, почему Replace работает в первом случае, но не с реестромключевые значения?к сведению, я работаю с Visual Studio Community 2017, набор инструментов платформы v141, Unicode, x64

1 Ответ

0 голосов
/ 13 ноября 2018

Документация по CString :: GetBuffer объясняет, как использовать этот член класса:

Если вы используете указатель, возвращаемый GetBuffer для изменения содержимого строки, вы должны вызвать ReleaseBuffer , прежде чем использовать любые другие CSimpleStringT методы-члены .

В противном случае внутреннее состояние объекта CString недопустимо. Семейство GetBuffer / ReleaseBuffer членов класса полезно, когда вам нужно присоединить не CString строковые данные к CString экземплярам. Первые временно отключают инварианты классов, где последние восстанавливают их, поэтому их всегда нужно вызывать в тандеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...