我在将值转换为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 ++不是我的主要开发语言。
更新:所提出的答案都不适合我。我找到了另一种方法来做我需要的事情。
答案 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::wstring
或CString
。