0

我现在用谷歌搜索了 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

4

3 回答 3

4

The resulting host_val is a possibly non-null-terminated string (see "Remarks"), so you should copy it to a newly allocated string with memcpy, and ensure it's null-terminated:

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';

You will need to delete[] the hostName later.

于 2012-09-07T06:06:36.553 回答
3

使用函数的 ANSI 版本

RegQueryValueExA

这样你就不需要转换了。

于 2012-09-07T06:29:25.030 回答
2

如果您使用 Unicode 进行编译,则您正在将 Unicode 字符串(可能未终止)复制到一个狭窄的 char 缓冲区中。unicode 字符串中的第一个字符将是 0x3100 (考虑到您机器上的字节序,这可能是 little-endian,并且您说 IP 地址是 192....)

填充到 char[] 数组中的值将报告为以单字符空字符结尾的字符串。你有两个选择。

  1. 使用 RegQueryValueExA,其他一切都保持不变,或者
  2. 将您的 char[] 数组更改为 wchar_t[] 数组,执行您当前正在执行的操作,然后使用 WideCharToMultiByte 转换为窄(文档在 SDK 中)。

出于显而易见的原因,我会选择这两个选项中的前一个。

于 2012-09-07T07:25:42.490 回答