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

1 c++ windows-xp visual-studio visual-c++

    \n
  1. 我启动一个使用“Visual Studio 2017 - Windows XP (v141_xp)”平台工具集的 C++ 项目
  2. \n
  3. 将运行时库设置为“多线程(/MT)”
  4. \n
  5. 将“调试”更改为“发布”
  6. \n
  7. 添加#include "<Wbemidl.h>"到源。
  8. \n
  9. CTRL F5(又名构建)
  10. \n
\n

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

\n
\n

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

\n
\n

你可能会问我想做什么?也许我的某些代码不好?您不应该转换wchar_t为,BSTR因为它未定义,结果会是什么?

\n

但在这里,这些不是我关心的。我没有添加任何代码 \xe2\x80\x93 只是包含单个标头(我留下了“Hello World”部分)。

\n

我没有显式转换任何内容,因为错误位于 Microsoft 系统标头中,而不是我的代码中。我没有添加任何与 QT 有关的内容,也不需要或想要 QT,所以这不是问题。

\n

我现在想使用<Wbemidl.h>标头编译我的“Hello World”程序。(当然,我不需要该标头来编译它,但是,如果我可以毫无问题地编译它,那么我很可能可以毫无问题地使用该库。)我想让它尽可能简单,这就是为什么它只是“Hello World”(MCVE)。

\n

我尝试添加以下内容但没有成功:

\n
#pragma comment(lib, "Shlwapi.lib")\n#pragma comment(lib, "wbemuuid.lib")\n
Run Code Online (Sandbox Code Playgroud)\n

我最好的猜测是我没有安装某些东西或者它只是被弃用了;有趣的是“2015 Visual Studio (140_xp)”可以工作。

\n

我只想编译我的 C++“Hello World”程序,其标题为“<Wbemidl.h>”,在“x86”中编译,“Visual Studio 2017 - Windows XP (v141_xp)”工具集和运行时库作为“多线程” (/公吨)”

\n

我的代码(MCVE):

\n
#include <iostream>\n#include <Wbemidl.h>    \n\nint main()\n{\n    std::cout << "Hello World!\\n";\n}\n
Run Code Online (Sandbox Code Playgroud)\n

微软代码错误

\n

我尝试过的其他事情:

\n
    \n
  1. 严格的 QT 字符串标签
  2. \n
  3. 包括其他东西
  4. \n
  5. 从“多线程 (/MT)”更改为“多线程 DLL (/MD)”
  6. \n
  7. 尝试制作 4 个不同的项目
  8. \n
\n

Adr*_*ica 5

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

\n

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

\n

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

\n

在此输入图像描述

\n

很可能仍然会有许多其他警告,但系统头至少会编译而不会出现错误。

\n

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

\n