提问人:Tony Tone 提问时间:12/28/2022 最后编辑:Adrian MoleTony Tone 更新时间:12/28/2022 访问量:297
C++“默认参数”:无法从“const wchar_t”转换为“BSTR”
C++ 'default argument': cannot convert from 'const wchar_t' to 'BSTR'
问:
- 我启动了一个使用“Visual Studio 2017 - Windows XP (v141_xp)”平台工具集的C++项目
- 将“运行时库”设置为“多线程 (/MT)”
- 将“Debug”更改为“Release”
- 添加到源。
#include "<Wbemidl.h>"
- CTRL F5(又名“生成”)
现在,我知道平台集已被弃用,但无论哪种方式,默认的 x64 版本都没有问题。但是,当我从“x64”更改为“x86”时(因为这是我想要的),它会产生许多错误,如下所示:
C++“默认参数”:无法从“const wchar_t”转换为“BSTR”
你可能会问我想做什么?也许我的一些代码很糟糕?您不应该转换为,因为它没有定义结果是什么?wchar_t
BSTR
但这些不是;我的担忧,在这里。我没有添加任何代码——只是单个标题包含(我留下了“Hello World”部分)。
我没有显式转换任何内容,因为错误在 Microsoft 系统标头中,而不是在我的代码中。我没有添加任何与 QT 有关的内容,我也不需要或想要 QT,所以这不是问题。
我现在只想使用标头编译我的“Hello World”程序。(当然,我不需要该标头来编译它,但是,如果我可以毫无问题地编译它,那么我很有可能毫无问题地使用该库。我想让它尽可能简单,因此它只是“Hello World”(MCVE)。<Wbemidl.h>
我尝试添加以下内容,但没有成功:
#pragma comment(lib, "Shlwapi.lib")
#pragma comment(lib, "wbemuuid.lib")
我最好的猜测是我没有安装某些东西,或者它只是被弃用了;有趣的是“2015 Visual Studio (140_xp)”有效。
我只想将我的C++“Hello World”程序编译为标题“<Wbemidl.h>”,在“x86”中编译,“Visual Studio 2017 - Windows XP (v141_xp)”工具集和运行时库为“多线程 (/MT)”
我的代码 (MCVE):
#include <iostream>
#include <Wbemidl.h>
int main()
{
std::cout << "Hello World!\n";
}
我尝试过的其他事情:
- 严格的 QT 字符串标签
- 包括其他东西
- 从“多线程 (/MT)”更改为“多线程 DLL (/MD)”
- 尝试制作 4 个不同的项目
答:
自 (IIRC) VS 2019(当然还有 VS 2022)以来,有一个 C++ 编译器设置(默认情况下)强制更严格地遵守语言标准。该设置(“一致性模式”)将阻止在(较旧的)SDK 头文件中使用的转换 ( 到 )。const w_char[]
BSTR
此选项已存在于 VS 2017 中,但默认情况下处于禁用状态;在 VS 2015 中(你说,它没有错误),该选项根本不存在。因此,当您将工具集从 VS 2022 更改为 VS 2017 时,您(无意中)启用了“一致性模式”选项。
若要禁用这些错误,需要关闭一致性模式。在您的项目设置中,转到“C/C++”...“语言”属性页,并将“一致性模式”设置为“否”:
很可能还会有许多其他警告,但系统头文件至少可以编译而不会出错。
请注意,使用较新的工具集时,MSVC 编译器使用较新 SDK 中的系统头文件;在这些标头中,问题已得到正确解决,因此可以使用一致性模式。
评论
BSTR
L""
BSTR