【问题标题】:Argument of type "char *" is incompatible with parameter of type "LPWSTR"“char *”类型的参数与“LPWSTR”类型的参数不兼容
【发布时间】:2013-12-16 13:15:08
【问题描述】:

这可能以前被问过,但我似乎找不到解决方案:

std::string GetPath()
{
    char buffer[MAX_PATH];
    ::GetSystemDirectory(buffer,MAX_PATH);
    strcat(buffer,"\\version.dll");

    return std::string(buffer);
}

这会返回一个错误说明:

argument of type "char *" is incompatible with parameter of type "LPWSTR"

是的。有人回答了吗?

【问题讨论】:

  • GetSystemDirectory 接受TCHAR 数组,其大小和类型根据项目设置和标志而有所不同。
  • 另外,告诉我们编译器抱怨哪一行会很有帮助。

标签: c++


【解决方案1】:

你需要使用ansi版本:

std::string GetPath()
{
     char buffer[MAX_PATH] = {};
     ::GetSystemDirectoryA(buffer,_countof(buffer)); // notice the A
     strcat(buffer,"\\version.dll");

     return std::string(buffer);
 }

或者使用unicode:

std::wstring GetPath()
{
     wchar_t buffer[MAX_PATH] = {};
     ::GetSystemDirectoryW(buffer,_countof(buffer)); // notice the W, or drop the W to get it "by default"
     wcscat(buffer,L"\\version.dll");

     return std::wstring(buffer);
 }

您可以删除 A/W 并将整个项目配置为使用 ansi/unicode,而不是显式调用 A/W 版本。所有这一切都会改变一些#defines,用fooA/W替换foo。

请注意,您应该使用 _countof() 来避免大小不正确,具体取决于缓冲区类型。

【讨论】:

  • @paulm 这修复了它。只是在等待计时器,以便我可以将其标记为已解决:/
  • @OliverMller 请务必选择第二个选项,并使用 Unicode。
  • @paulm 不!保持信念! TCHAR 是仅在需要支持 Windows 98 时才使用的最后手段。
  • 我从来没有真正看到过在最近的代码中使用 TCHAR / _tcscat - 我想这可以解释为什么:)
【解决方案2】:

如果您使用多字节支持编译您的代码,它将正确编译,但是当您使用 Unicode 标志编译它时会出错,因为在 Unicode 支持中 ::GetSystemDirectoryA 变为 ::GetSystemDirectoryW 使用考虑使用 TCHAR 而不是 char。TCHAR 是定义为多字节标志中的 char 和带有 Unicode 标志的 wchar_t

TCHAR buffer[MAX_PATH];
::GetSystemDirectory(buffer,MAX_PATH);
_tcscat(buffer,_T("\\version.dll"));

您可以对字符串 /wstring 使用 typedef,这样您的代码就变得独立了

#ifdef UNICODE 
typedef wstring STRING;
#else
typedef string STRING;
#endif

STRING GetPath()
{
    TCHAR buffer[MAX_PATH];
    ::GetSystemDirectory(buffer,MAX_PATH);
    _tcscat(buffer,_T("\\version.dll"));

    return STRING(buffer);
}

【讨论】:

  • _tcscat 会映射到 strcat/wcscat 吗?
  • 这是准确的,但现在很难证明TCHAR 的严重混淆是合理的。仅当您希望您的代码在 Windows 98 上运行时才真正有用。
  • 是的,如果你想使用可以使用 Unicode 标志和 WCHAR 而不是 TCHAR 构建
  • @kunal 或者只使用标准的 wchar_t 而不是 wacko 宏。
  • 没有理由编译 Win32 非 UNICODE。最好使用正确的类型,而不是使用所有这些愚蠢的 MS 主义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 2016-05-19
  • 2017-01-02
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
相关资源
最近更新 更多