我很难把LPCWSTR投给LPCSTR。
一些背景
我正在编写一个VC++ 2010应用程序,并且已经遇到了不得不从类型System::String^转换为std::string的情况。我使用了这段代码来做到这一点:
private: std::string toss(System::String^ s)
{
msclr::interop::marshal_context context;
return context.marshal_as<std::string>(s);
}这样做,我想我会解决我所有的问题。我错了。因此,我需要将std::string转换为LPCSTR,以便与某些Windows一起使用。
在阅读了一些现有的问题后,我觉得自己被困住了。我被告知要使用:
LPCSTR str = existingstr.c_str();然而,当我使用它时,我会得到一个错误:不能从LPCWSTR转换为LPCSTR
有没有人能更好地了解我在这个特定情况下应该做什么,或者我如何从LPCWSTR转换为LPCSTR?
提前谢谢。
发布于 2011-02-25 01:43:38
编辑:完全误解了这个问题,所以无视我先前的回答,对不起。如果以后需要将此字符串传递到Windows,那么是否有理由使用std::string而不是std::wstring?
附加编辑:这里有一些混乱的地方。存在‘re的类型是什么,您正在调用的Windows函数的签名是什么?我想这会帮你理清问题。如果存在std是std::string,那么.cstr()与LPCSTR (即const*)兼容。如果存在std是std::wstring,则不存在。API是采用LPCSTR还是LPCWSTR?
你可以用这个代替:
private: std::wstring toss(System::String^ s)
{
std::wstring result;
{
pin_ptr<wchar_t const> ptr = PtrToStringChars(s);
result = ptr;
}
return result;
}std::wstring上的.c_str()将导致wchar_t const* (即LPCWSTR)。
发布于 2011-02-25 03:22:01
在wchar和基于char的字符串之间来回转换时,我使用以下两个例程:
include <string> // std::string, std::wstring
include <algorithm> // std::copy
std::wstring StringToWString(const std::string& s)
{
std::wstring temp(s.length(),L' ');
std::copy(s.begin(), s.end(), temp.begin());
return temp;
}
std::string WStringToString(const std::wstring& s)
{
std::string temp(s.length(), ' ');
std::copy(s.begin(), s.end(), temp.begin());
return temp;
} 现在,您可以通过以下假设来解决您的问题:
std::string narrow_str(WStringToString(existingstr));
LPCSTR win_str = narrow_str.c_str(); 你可以走另一条路,只要有一些“狭窄的”,你就可以轻松地走下去:
std::wstring wide_str(StringToWString(narrowstr));
LPWCSTR win_wstr = wide_str.c_str(); 显然,这是没有效率的,因为您既分配了一个本地,又通过堆栈复制了它(我通过使用构造函数初始化而不是assignment...some编译器通过这种方式优化了额外的副本,从而减轻了这一点)。
如果可能的话,最好使用UNICODE宏来处理相应版本的Windows (参见http://msdn.microsoft.com/en-us/library/ff381407%28v=vs.85%29.aspx --使用Strings (Windows))。
然而,假设这是不可能的,因为兼容性的原因,它确实给您一些洞察力,什么需要发生。
发布于 2011-02-25 02:58:49
考虑到existingstr.c_str()导致的Cannot convert from LPCWSTR to LPCSTR,您必须使用定义的UNICODE进行编译。对于传递给Win API的param,请使用LPCWSTR而不是LPCSTR:
LPCWSTR str = existingstr.c_str();
无论如何,CString有一些不错的转换函数:
CStringA strA(existingstr.c_str());
您可以将strA传递给任何想要LPCSTR的人。
https://stackoverflow.com/questions/5112633
复制相似问题