windows — преобразование символов C ++

Я погуглил это в течение 2 часов, и я не могу найти ответ на свою проблему: мне нужно получить реестр REG_SZ оценить и передать его char*,

char host_val[1024];
DWORD hostVal_size = 1024;
char* hostName;
DWORD dwType = REG_SZ;

RegOpenKeyEx(//no problem here);
if( RegQueryValueEx( hKey, TEXT("HostName"), 0, &dwType, (LPBYTE)&host_val, &hostVal_size ) == ERROR_SUCCESS )
{
//hostName = host_val;
}

Как мне сделать это преобразование hostName = host_val?

0

Решение

Если вы компилируете с помощью Unicode, вы копируете строку Unicode (которая, возможно, НЕ заканчивается) в узкий буфер символов. первый символ в строке Unicode будет 0x3100 (учитывая порядковый номер на вашем компьютере, который, скорее всего, является прямым порядком байтов, и тот факт, что вы сказали, что IP-адрес 192 ….)

Это значение, вставленное в массив char [], будет возвращено как строка с одинарным символом и нулем в конце. У вас есть два варианта.

  1. Используйте RegQueryValueExA, все остальное остается прежним, или
  2. Измените ваш массив char [] на массив wchar_t [], сделайте то, что вы в настоящее время делаете, затем преобразуйте в узкий, используя WideCharToMultiByte (документы находятся в SDK).

По понятным причинам я бы выбрал первый из этих двух вариантов.

2

Другие решения

Результирующий host_val это возможно, строка с нулевым символом в конце (см. «Замечания»), поэтому вы должны скопировать его во вновь выделенную строку с memcpyи убедитесь, что он завершен нулем:

hostName = new char[hostVal_size + 1];
// host_val may or may not be null-terminated
memcpy(hostName, host_val, hostVal_size);
hostName[hostVal_size] = '\0';

Вам нужно будет delete[] hostName потом.

4

используйте версию функции ANSI

RegQueryValueExA

Таким образом, вам не нужно конвертировать.

3
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector