Любая функция Win32 API, которая принимает параметры TCHAR
, LPTSTR
или LPCTSTR
, будет принимать либо данные Ansi, либо Unicode, в зависимости от того, определено ли условие UNICODE
во время компиляции (функции RTL, такие как _tcscpy
, используют1006 * условно вместо).Итак, что в действительности происходит в этом случае, так это то, что когда вы вызываете RegSetValueEx()
в своем коде, компилятор разрешает ему вызов либо RegSetValueExA()
(Ansi), либо RegSetValueExW()
(Unicode) в зависимости от условия UNICODE
.
Класс CStringA
предназначен только для данных Ansi.Вы должны преобразовать его данные в Unicode при вызове RegSetValueExW()
.
Чтобы сделать то, что вы пытаетесь, вам нужно:
1) вызвать RegSetValueExA()
явно вместо RegSetValueEx()
в общем случае, если вы продолжаете использовать класс CStringA
:
CStringA temp(setvalue);
lResult = RegSetValueExA(hKey, path, NULL, REG_SZ, (LPBYTE)(LPSTR)temp, (temp.GetLength() + 1) * sizeof(CHAR));
2) Используйте класс CString
вместо класса CStringA
.CString
основан на TCHAR
, поэтому на него также влияет условное выражение UNICODE
, и поэтому он соответствует формату, который ожидает RegSetValuEx()
:
CString temp(setvalue);
lResult = RegSetValueEx(hKey, path, NULL, REG_SZ, (LPBYTE)(LPTSTR)temp, (temp.GetLength() + 1) * sizeof(TCHAR));
В последнем случае, если вашsetvalue
переменная уже является CString
, затем просто используйте ее как есть, не нужно создавать temp
ее копию:
lResult = RegSetValueEx(hKey, path, NULL, REG_SZ, (LPBYTE)(LPTSTR)setvalue, (setvalue.GetLength() + 1) * sizeof(TCHAR));