将值转换为LPWSTR时遇到困难。我正在获取注册表值,并尝试将结果作为LPWSTR返回。看来使用RegQueryValueExW进行的注册表调用可与多种类型的数据一起使用来存储结果,但是我无法将其中的任何类型强制转换回LPWSTR。

LPWSTR value;
HKEY hKey;

long result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"RegEntry1", 0, ACCESS|KEY_WOW64_32KEY, &hKey);
if (result == ERROR_SUCCESS)
{
   //WCHAR buffer[512];
   //TCHAR buffer[512];
   LPWSTR buffer[512];
   DWORD bufferSize = sizeof(buffer);
   ULONG queryVal = 0;

   queryVal = RegQueryValueExW(hKey, L"Path", 0, NULL, (LPBYTE)buffer, &bufferSize);
   if (queryVal == ERROR_SUCCESS)
   {
      //Access violation error here; I need some type of conversion.
      value = buffer;
   }
}

到目前为止,我在这里没有看过的帖子都没有给我答案。 C++不是我的主要开发语言。

更新:没有一个建议的答案对我有用。我找到了另一种方法来做自己需要的事情。

最佳答案

您的buffer变量应声明512个wchar_t*字符数组时声明一个512个wchar_t指针数组。代码的第一行注释掉是要使用的正确代码:

WCHAR buffer[512];
DWORD bufferSize = sizeof(buffer);

ULONG queryVal = RegQueryValueExW(hKey, L"Path", 0, NULL, (LPBYTE)buffer, &bufferSize);
if (queryVal == ERROR_SUCCESS)
{
    //...
}

请记住,如果注册表值未使用其自己的null终止符存储,则该缓冲区将不会以null终止,因此,为防万一,您应该为自己的null终止符分配一些额外的空间:
WCHAR buffer[512+1];
DWORD bufferSize = (sizeof(buffer) - sizeof(WCHAR));

LONG queryVal = RegQueryValueExW(hKey, L"Path", 0, NULL, (LPBYTE)buffer, &bufferSize);
if (queryVal == ERROR_SUCCESS)
{
    buffer[bufferSize / sizeof(WCHAR)] = 0;
    //...
}

另外,也可以使用RegGetValue(),它为您处理空终止符:
WCHAR buffer[512+1];
DWORD bufferSize = sizeof(buffer);

LONG queryVal = RegGetValueW(hKey, NULL, L"Path", RRF_RT_REG_SZ | RRF_RT_REG_EXPAND_SZ, NULL, buffer, &bufferSize);
if (queryVal == ERROR_SUCCESS)
{
    //...
}

关于c++ - 如何将LPWSTR *(或WCHAR *)转换为LPWSTR,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12695134/

10-13 09:10