首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从LPCWSTR到LPCSTR的转换

从LPCWSTR到LPCSTR的转换
EN

Stack Overflow用户
提问于 2011-02-25 01:30:21
回答 4查看 14.9K关注 0票数 1

我很难把LPCWSTR投给LPCSTR。

一些背景

我正在编写一个VC++ 2010应用程序,并且已经遇到了不得不从类型System::String^转换为std::string的情况。我使用了这段代码来做到这一点:

代码语言:javascript
复制
private: std::string toss(System::String^ s)
    {
        msclr::interop::marshal_context context;
        return context.marshal_as<std::string>(s);
    }

这样做,我想我会解决我所有的问题。我错了。因此,我需要将std::string转换为LPCSTR,以便与某些Windows一起使用。

在阅读了一些现有的问题后,我觉得自己被困住了。我被告知要使用:

代码语言:javascript
复制
LPCSTR str = existingstr.c_str();

然而,当我使用它时,我会得到一个错误:不能从LPCWSTR转换为LPCSTR

有没有人能更好地了解我在这个特定情况下应该做什么,或者我如何从LPCWSTR转换为LPCSTR?

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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?

你可以用这个代替:

代码语言:javascript
复制
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)。

票数 2
EN

Stack Overflow用户

发布于 2011-02-25 03:22:01

在wchar和基于char的字符串之间来回转换时,我使用以下两个例程:

代码语言:javascript
复制
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;  
}  

现在,您可以通过以下假设来解决您的问题:

代码语言:javascript
复制
std::string narrow_str(WStringToString(existingstr));  

LPCSTR win_str = narrow_str.c_str();  

你可以走另一条路,只要有一些“狭窄的”,你就可以轻松地走下去:

代码语言:javascript
复制
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))。

然而,假设这是不可能的,因为兼容性的原因,它确实给您一些洞察力,什么需要发生。

票数 5
EN

Stack Overflow用户

发布于 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的人。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5112633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档