C++“默认参数”:无法从“const wchar_t”转换为“BSTR”

C++ 'default argument': cannot convert from 'const wchar_t' to 'BSTR'

提问人:Tony Tone 提问时间:12/28/2022 最后编辑:Adrian MoleTony Tone 更新时间:12/28/2022 访问量:297

问:

  1. 我启动了一个使用“Visual Studio 2017 - Windows XP (v141_xp)”平台工具集的C++项目
  2. 将“运行时库”设置为“多线程 (/MT)”
  3. 将“Debug”更改为“Release”
  4. 添加到源。#include "<Wbemidl.h>"
  5. CTRL F5(又名“生成”)

现在,我知道平台集已被弃用,但无论哪种方式,默认的 x64 版本都没有问题。但是,当我从“x64”更改为“x86”时(因为这是我想要的),它会产生许多错误,如下所示:

C++“默认参数”:无法从“const wchar_t”转换为“BSTR”

你可能会问我想做什么?也许我的一些代码很糟糕?您不应该转换为,因为它没有定义结果是什么?wchar_tBSTR

但这些不是;我的担忧,在这里。我没有添加任何代码——只是单个标题包含(我留下了“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";
}

Microsoft 代码错误

我尝试过的其他事情:

  1. 严格的 QT 字符串标签
  2. 包括其他东西
  3. 从“多线程 (/MT)”更改为“多线程 DLL (/MD)”
  4. 尝试制作 4 个不同的项目
C 工作室 可视化 C++ Windows-XP

评论

1赞 Retired Ninja 12/28/2022
发生错误的线路是什么?
1赞 Captain Obvlious 12/28/2022
FWIW 该类型永远不应默认为宽字符串,因为它们根本不是一回事。 types 携带字符串的长度,而普通的 C 样式宽字符串则不携带。头文件不正确。BSTRL""BSTR
0赞 selbie 12/28/2022
Visual Studio 2022 上没有重现。能否双击 Visual Studio 输出中的一个错误行,并显示它所抱怨的有问题的代码行?
1赞 Captain Obvlious 12/28/2022
@selbie 不,它们指向相同类型的字符数据,但它们并不相同,并且 BSTR 的分配方式不同。BSTR 类型的长度以字符数据为前缀(4 字节 IIRC),如果该长度不存在,则许多函数的行为将不正确。
3赞 Avi Berger 12/28/2022
FWIW:以下代码不正确:BSTR MyBstr = L“I am a happy BSTR”;

答:

5赞 Adrian Mole 12/28/2022 #1

自 (IIRC) VS 2019(当然还有 VS 2022)以来,有一个 C++ 编译器设置(默认情况下)强制更严格地遵守语言标准。该设置(“一致性模式”)将阻止在(较旧的)SDK 头文件中使用的转换 ( 到 )。const w_char[]BSTR

此选项已存在于 VS 2017 中,但默认情况下处于禁用状态;在 VS 2015 中(你说,它没有错误),该选项根本不存在。因此,当您将工具集从 VS 2022 更改为 VS 2017 时,您(无意中)启用了“一致性模式”选项。

若要禁用这些错误,需要关闭一致性模式。在您的项目设置中,转到“C/C++”...“语言”属性页,并将“一致性模式”设置为“否”:

enter image description here

很可能还会有许多其他警告,但系统头文件至少可以编译而不会出错

请注意,使用较新的工具集时,MSVC 编译器使用较新 SDK 中的系统头文件;在这些标头中,问题已得到正确解决,因此可以使用一致性模式。