2010-03-19 4 views
1

Читаю значение реестра, как это:C++ чтения реестра значение строки в символ *

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, 3А, 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(); 
} 
} 

ответ

3

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

+0

Код, который я использовал: WideCharToMultiByte (CP_NONE, 0, (LPCWSTR) keyval, -1, ascii, asciil, NULL, NULL); –

+0

Если вам действительно не нужно создавать свой проект с использованием свойства набора символов, установленного в Unicode (по умолчанию в VS2008), решение Maurizio, вероятно, лучше. – Ferruccio

2

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

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

Doh! headlap для того, чтобы не думать о # 2, так очевидно ... – Ferruccio

Смежные вопросы