【问题标题】:Visual Studio 2010 Arduino cpp Error: argument of type "char *" is incompatible with parameter of type "LPCWSTR"Visual Studio 2010 Arduino cpp 错误:“char *”类型的参数与“LPCWSTR”类型的参数不兼容
【发布时间】:2015-08-28 14:44:35
【问题描述】:

我正在尝试设置一个 arduino uno 用于与 Visual Studio 2010 中的 C++ 程序进行串行端口通信。我正在使用此处找到的代码:http://playground.arduino.cc/Interfacing/CPPWindows

不幸的是,.cpp 文件在第 9 行为变量“portName”提供了以下消息:

错误:“char *”类型的参数与“LPCWSTR”类型的参数不兼容

我不明白这个错误消息,并尝试了一些不同的方法来修复它。任何帮助将不胜感激!

【问题讨论】:

标签: c++ visual-studio arduino tchar lpcwstr


【解决方案1】:

鉴于您问题中的代码链接,问题似乎在这里:

Serial::Serial(char *portName)
{
    ...

    this->hSerial = CreateFile(portName,  // <--- ERROR

CreateFile is a Win32 API that expects an LPCTSTR as first string parameter.

LPCTSTR是一个Win32 typedef,扩展为:

  • const char* 在 ANSI/MBCS 版本中
  • Unicode 版本中的const wchar_t*(自 VS2005 以来一直是默认设置)

由于您使用的是 VS2010,可能您处于默认的 Unicode 构建模式。

实际上,没有公开“物理”CreateFile API,但有两个不同的功能:CreateFileACreateFileW。前者采用const char* 输入字符串,后者采用const wchar_t*

在 Unicode 版本中,CreateFile 是扩展为 CreateFileW 的预处理器宏;在 ANSI/MBCS 版本中,CreateFile 扩展为 CreateFileA

因此,如果您处于 Unicode 构建模式,您的 CreateFile 调用将扩展为 CreateFileW(const wchar_t*, ...)。由于portName 被定义为char*wchar_t*char* 之间存在不匹配,您会收到编译器错误。

要解决这个问题,您有一些选择。

例如,您可以在代码中显式地调用 CreateFileA() 而不是 CreateFile()。这样,您将使用函数的 ANSI/MBCS 版本(即采用 const char* 的函数),独立于 Visual Studio 中的实际 ANSI/MBCS/Unicode 设置。


另一个选项是将您当前的构建设置从默认的 Unicode 模式更改为 ANSI/MBCS。为此,您可以按照以下路径进行操作:

Project Properties | Configuration Properties | General | Character Set

并选择“使用多字节字符集”,如下图所示:

【讨论】:

  • 你的答案对初学者来说肯定比我的更有用,+1 :)
  • 感谢您提及 CreateFileA 和 CreateFileW。我什至不知道他们。
【解决方案2】:

您在 Visual Studio 中的设置可能设置为 Unicode,但您正在编译的代码需要 ASCII。

进入项目属性 -> 配置属性 -> 常规 -> 字符集并选择“使用多字节字符集”。

-苏伦塔尔

【讨论】:

    【解决方案3】:

    您在 Visual Studio 中的设置可能设置为 Unicode,但您正在编译的代码需要 ASCII。

    进入项目属性 -> 配置属性 -> 常规 -> 字符集并选择“使用多字节字符集”。

    您还应该从 C++ -> 预处理器 -> 预处理器定义中删除 UNICODE_UNICODE,如果它们在那里定义的话。

    这将使您的代码调用接受 char 字符串的 ASCII 版本的 Windows API 函数。

    【讨论】:

    • AND 常数。 LPCWSTR 的意思是“指向常量宽字符串的长指针”。 wchar_t const *.
    • 字符串被标记为const,因为CreateFile不会改变它,但你仍然可以传递一个非常量指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多