之前可能已经提出这个问题,但我似乎无法找到解决方案:
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"
所以是的。有人得到了答案吗?
答案 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);
}