“char *”类型的参数与“LPWSTR”类型的参数不兼容

Posted

技术标签:

【中文标题】“char *”类型的参数与“LPWSTR”类型的参数不兼容【英文标题】:Argument of type "char *" is incompatible with parameter of type "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 数组,其大小和类型根据项目设置和标志而有所不同。 另外,告诉我们编译器抱怨哪一行会很有帮助。 【参考方案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 主义。

以上是关于“char *”类型的参数与“LPWSTR”类型的参数不兼容的主要内容,如果未能解决你的问题,请参考以下文章

GetModuleFileName函数第2个参数是LPWSTR 类型,结果读出来的路径中间总有一个0

ANSI与Unicode编码,TCHAR | LPSTR | LPCSTR | LPWSTR | LPCWSTR | LPTSTR | LPCTSTR 的含义

如何在 vc++ 中将 char* 转换为 LPWSTR..........................? [复制]

E0167 “CHAR *”类型的参数与“const wchar_t *”类型的参数不兼容

怎么把char型数组转换为lpwstr

“const char *”类型的参数与“Person”类型的参数不兼容