C ++ читать значение строки реестра в char * - PullRequest
1 голос
/ 19 марта 2010

Я читаю значение реестра следующим образом:

char mydata[2048];
DWORD dataLength = sizeof(mydata);
DWORD dwType = REG_SZ;

..... open key, etc
ReqQueryValueEx(hKey, keyName, 0, &dwType, (BYTE*)mydata, &dataLength);

Моя проблема в том, что после этого содержимое mydata выглядит следующим образом: [63, 00, 3A, 00, 5C, 00 ...], т.е. это выглядит как Unicode?!?!.

Мне нужно как-то преобразовать это в обычный массив символов без этих [00], так как они не справляются с простой функцией регистрации, которую я имею. То есть если я вызываю так: WriteMessage (mydata), он выводит только «c», который является первым символом в реестре. У меня есть повсюду вызовы этой функции ведения журнала, поэтому лучше не изменять ее, а как-то «исправить» значение реестра. Вот функция журнала:

void Logger::WriteMessage(const char *msg)
{
 time_t now = time(0);
 struct tm* tm = localtime(&now);
 std::ofstream logFile;

 logFile.open(filename, std::ios::out | std::ios::app);

 if ( logFile.is_open() )
 {
  logFile << tm->tm_mon << '/' << tm->tm_mday << '/' << tm->tm_year << ' ';
  logFile << tm->tm_hour << ':' << tm->tm_min << ':' << tm->tm_sec << "> ";
  logFile << msg << "\n";
  logFile.close();
 }
}

Ответы [ 2 ]

3 голосов
/ 19 марта 2010

Посмотрите на WideCharToMultiByte ().

2 голосов
/ 20 марта 2010

У вас есть два решения здесь:

  1. Измените свой код на wchar_t mydata[2048];. Поскольку базовый код - UNICODE, вы получите наилучшую производительность.
  2. Используйте RegQueryValueExA(), если производительность в этой области не имеет значения.
...