RegSetValueEx не устанавливается в сборке проекта Unicode - PullRequest
0 голосов
/ 12 декабря 2011

Я пытаюсь записать данные в реестр, но вместо этого он всегда пишет на иностранном языке, потому что установленное значение «MyApp»

CStringA temp(setvalue);//setvalue is CString type
const BYTE* pData = (const BYTE*)(LPCSTR)temp;
lResult = RegSetValueEx(hKey, path, NULL, REG_SZ, (LPBYTE)pData, sizeof(pData));
RegCloseKey(hKey);

if(lResult == ERROR_SUCCESS || lResult == ERROR_MORE_DATA)
    return true;
else
    return false;

спасибо.

Ответы [ 3 ]

3 голосов
/ 12 декабря 2011

Способ преобразования CString в BYTE * вызывает проблему. Нет необходимости использовать CStringA.

Попробуйте преобразовать CString в TCHAR. Это должно работать

LPTSTR lpszData = new TCHAR[setvalue.GetLength()+1]; // setvalue is CString type...
_tcscpy(lpszData , csTemp);

lResult = RegSetValueEx(hKey, path, NULL, REG_SZ, (LPBYTE)lpszData, setvalue.GetLength()+1);

delete[] lpszData;// don't forget to do this.
1 голос
/ 12 декабря 2011

Попробуйте RegSetValueExA ().Вы вызываете функцию, которая ожидает Unicode-строки.функция A () принимает аргументы ANSI

0 голосов
/ 13 декабря 2011

Любая функция 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)); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...