如何将LPWSTR *(或WCHAR *)转换为LPWSTR

时间:2012-10-02 17:21:57

标签: c++ registry type-conversion

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

更新:所提出的答案都不适合我。我找到了另一种方法来做我需要的事情。

2 个答案:

答案 0 :(得分:2)

你的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) 
{  
    //...
} 

请记住,如果Registry值没有与自己的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) 
{  
    //...
} 

答案 1 :(得分:1)

您不想要LPWSTR的缓冲区,您需要wchar_t的缓冲区。指向它的指针为LPWSTR,因为它是wchar_t *的typedef。

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

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

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

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