错误:无法在 C++ 中将 'const CHAR**' {aka 'const char**'} 转换为 'LPCSTR' {aka 'const char*'}

时间:2021-02-20 17:20:08

标签: c++ c++11 winapi

我有一大段代码正在调试,但我一直在试图弄清楚为什么在我尝试构建项目时会出现以下错误:

<块引用>

"错误:无法将 'const CHAR**' {aka 'const char**'} 转换为 'LPCSTR' {aka 'const char*'}"

问题在于 wsKey 参数。 SHRegGetValue 是在 Shlwapi.h 标头中定义的函数,但我不知道如何解决这个问题,而且我对 Windows API 缺乏经验。如果有解决方案,请告诉我。

LPCSTR wsKey[MAX_PATH] = {"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"};
WCHAR wsValue[MAX_PATH] = L"ProxyEnable";
DWORD dwValue = (DWORD)FALSE;
DWORD dwSize = sizeof(dwValue);
LONG nStatus = SHRegGetValue(HKEY_CURRENT_USER, wsKey, wsValue, SRRF_RT_DWORD, NULL, &dwValue, &dwSize);

2 个答案:

答案 0 :(得分:4)

行:

LPCSTR wsKey[MAX_PATH] = {"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"};

wsKey 声明为 MAX_PATH 字符指针 的数组,其中第一个指向给定的字符串文字。如果这真的是您想要的,那么您的 SHRegGetValue 调用的第二个参数应该是第一个元素:wsKey[0]

然而,更有可能的是,您需要 wsKey 成为 MAX_PATH 字符 - 不是 指针的数组。像这样:

const CHAR wsKey[MAX_PATH] = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"; // Note the removal of the enclosing {...} braces!

SHRegGetValue 的第三个参数也有错误:这应该是一个 char(或 CHAR)字符串,不是一个 {{1 }} 字符串(您混淆了调用的 ANSI 和 Unicode 版本)。像这样声明 WCHAR,以使用 ANSI 版本:

wsValue

或者,如果您打算使用宽字符 (Unicode) 版本,那么您需要将 CHAR wsValue[MAX_PATH] = "ProxyEnable"; 更改为宽字符字符串。 (鉴于变量名称,这似乎更有可能。)

wsKey

答案 1 :(得分:0)

您的问题不是在标题中回答了吗:const char** 不是 const char*。为什么你认为它应该有效?

我认为这是复制和粘贴错误。你应该写:

LPCSTR wsKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";

LPCSTR 是 const char * 的别名