C++ C++;读取char中的注册表字符串值*

C++ C++;读取char中的注册表字符串值*,c++,unicode,registry,char,C++,Unicode,Registry,Char,我正在读取如下注册表值: char mydata[2048]; DWORD dataLength = sizeof(mydata); DWORD dwType = REG_SZ; ..... open key, etc ReqQueryValueEx(hKey, keyName, 0, &dwType, (BYTE*)mydata, &dataLength); 我的问题是,在这之后,我的数据内容看起来像:[63,00,3A,00,5C,00…],也就是说,这看起来像一个uni

我正在读取如下注册表值:

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

..... open key, etc
ReqQueryValueEx(hKey, keyName, 0, &dwType, (BYTE*)mydata, &dataLength);
我的问题是,在这之后,我的数据内容看起来像:[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();
 }
}
void记录器::WriteMessage(const char*msg)
{
现在时间=时间(0);
struct tm*tm=localtime(&now);
流日志文件的std::of;
打开(文件名,std::ios::out | std::ios::app);
if(logFile.is_open())
{

logFile tm_mon查看()。

查看()。

这里有两种解决方案:

  • 将代码更改为
    wchar\u t mydata[2048];
    。由于底层代码是UNICODE,您将获得最佳性能
  • 如果您不关心此区域的性能,请使用
    RegQueryValueExA()

  • 这里有两种解决方案:

  • 将代码更改为
    wchar\u t mydata[2048];
    。由于底层代码是UNICODE,您将获得最佳性能
  • 如果您不关心此区域的性能,请使用
    RegQueryValueExA()

  • 我使用的代码是:WideChartMultiByte(CP_NONE,0,(LPCWSTR)keyval,-1,ascii,asciil,NULL,NULL);除非您确实需要将字符集属性设置为Unicode(VS2008下的默认值)来构建项目,Maurizio的解决方案可能更好。我使用的代码是:WideChartMultiByte(CP_NONE,0,(LPCWSTR)keyval,-1,ascii,asciil,NULL,NULL);除非您确实需要使用字符集属性设置为Unicode(VS2008下的默认值)构建项目,否则Maurizio的解决方案可能更好。