1

我很难将值转换为 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++ 不是我的主要开发语言。

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

4

2 回答 2

2

你不想要 的缓冲区LPWSTR,你想要 的缓冲区wchar_tLPWSTR指向它的指针将是wchar_t *.

WinNT.h 中的这两行是相关的:

typedef wchar_t WCHAR;    // wc,   16-bit UNICODE character

typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;

编辑:我怀疑问题出在您没有向我们展示的部分代码上。你是value从函数返回吗?如果是这样,那么问题是您正在返回一个指向已超出范围并被销毁的缓冲区的指针。我会返回一个std::wstringor CString

于 2012-10-02T17:29:10.397 回答
2

当你的buffer变量wchar_t*应该声明一个 512 个wchar_t字符的数组时,它声明了一个由 512 个指针组成的数组。注释掉的第一行代码是正确的代码:

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

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

请记住,如果注册表值未使用自己的空终止符存储,则缓冲区不会以空终止,因此您应该为自己的空终止符分配一些额外的空间,以防万一:

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) 
{  
    //...
} 
于 2012-10-02T17:40:33.483 回答