从LPCWSTR转换为LPCSTR

时间:2011-02-25 01:30:22

标签: .net c++ winapi

我在尝试将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 API一起使用。

在阅读了关于SO的一些现有问题后,我觉得自己被卡住了。有人告诉我使用:

LPCSTR str = existingstr.c_str();

但是当我使用它时,我收到错误:无法从LPCWSTR转换为LPCSTR

有没有人更清楚我在这个特定情况下应该做些什么,或者我如何从LPCWSTR转换为LPCSTR?

提前致谢。

4 个答案:

答案 0 :(得分:4)

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

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

您现在可以通过以下方式解决您的问题,假设'existingstr'是一个宽字符串字符串:

std::string narrow_str(WStringToString(existingstr));  

LPCSTR win_str = narrow_str.c_str();  

你可以通过另一种方式轻松地给出一些'narrowstr':

std::wstring wide_str(StringToWString(narrowstr));  

LPWCSTR win_wstr = wide_str.c_str();  

显然,这样做效率不高,因为你要分配一个本地然后通过堆栈将其复制回来(我通过使用构造函数初始化而不是赋值来缓解这一点......一些编译器优化了额外的副本,方式)。

如果可能,最好使用UNICODE宏来使用适当版本的Windows API(请参阅http://msdn.microsoft.com/en-us/library/ff381407%28v=vs.85%29.aspx - 使用字符串(Windows))。

但是,假设出于兼容性原因无法做到这一点,它确实可以帮助您了解需要发生的事情。

答案 1 :(得分:1)

编辑:完全误读了这个问题所以忽略我之前的回答,对不起。如果您需要稍后将此字符串传递给Windows API,您是否有理由使用std :: string而不是std :: wstring?

补充编辑:我这里有些困惑。 existsingstr的类型是什么,以及您正在调用的Windows API函数的签名是什么?我认为这有助于澄清问题。如果existingstr是std :: string,则.cstr()与LPCSTR兼容(即char const *)。如果existingstr是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)。

答案 2 :(得分:1)

鉴于existingstr.c_str()导致Cannot convert from LPCWSTR to LPCSTR,您必须使用已定义的UNICODE进行编译。使用LPCWSTR代替LPCSTR作为您传递给Win API的参数:

LPCWSTR str = existingstr.c_str();

无论如何,CString有一些不错的转换器:

CStringA strA(existingstr.c_str());

您可以将strA传递给任何想要LPCSTR

的内容

答案 3 :(得分:0)

看起来您正在使用基于LPCSTR关键字的MFC。 MFC提供了几个转换宏/函数:

http://msdn.microsoft.com/en-us/library/87zae4a3%28v=vs.80%29.aspx

CA2W(s):将ascii字符串转换为宽字符串,例如CStringA - &gt; CStringW

CW2A(s):将一个宽字符串转换为ascii字符串,例如CStringW - &gt; CStringA

还有其他人。