“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..........................? [复制]