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

时间:2013-12-16 13:15:09

标签: c++

之前可能已经提出这个问题,但我似乎无法找到解决方案:

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"

所以是的。有人得到了答案吗?

2 个答案:

答案 0 :(得分:16)

您需要使用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版本,而是可以删除A / W并将整个项目配置为使用ansi / unicode。所有这一切都将改变一些#defines以用fooA / W替换foo。

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

答案 1 :(得分:0)

如果使用MultiByte支持编译代码,它将正确编译,但是当你使用Unicode标志编译它时会产生错误,因为在Unicode支持:: GetSystemDirectoryA变为:: GetSystemDirectoryW时请考虑使用TCHAR而不是char.TCHAR是定义为在Multibyte标志中变为char,在Unicode标志中变为wchar_t

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

您可以将typedef用于string / wstring,以便您的代码变得独立

#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);
}