将值转换为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/