2011-02-25 453 views
1

我在尝试将LPCWSTR转换为LPCSTR时遇到问题。从LPCWSTR转换为LPCSTR

一些背景

我编程一个VC++ 2010应用程序,并已运行到哪里,我不得不从类型系统转换的情况::字符串^到的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?

在此先感谢。

+1

'existingstr'的​​类型是什么?你还需要什么来使用LPCSTR? – user470379 2011-02-25 01:49:00

+0

我遇到了相反的问题。从lpcstr转换为lpcwstr。在常规属性中使用“使用多字节字符集”解决了问题。 – Pramod 2012-03-05 07:01:53

回答

1

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

附加编辑:这里有一些困惑。 existsingstr的类型是什么,你调用的Windows API函数的签名是什么?我认为这有助于清理事情。如果existsingstr是std :: string,则.cstr()与LPCSTR(即char const *)兼容。如果existingstr是std :: wstring,则不是。 API是否采用LPCSTR或LPCWSTR?在一个std

private: std::wstring toss(System::String^ s) 
{ 
    std::wstring result; 
    { 
     pin_ptr<wchar_t const> ptr = PtrToStringChars(s); 
     result = ptr; 
    } 
    return result; 
}

.c_str():: wstring的将导致wchar_t的常量*(即一个LPCWSTR):

你也可以使用这个。

+0

existsingstr是std :: string类型。但是,当我使用existsingstr.c_str()时,它返回类型LPCWSTR而不是LPCSTR。 – 2011-02-25 03:24:00

+0

std :: string应该是std :: basic_string的typedef 。因此,c_str()应该返回一个char const *。你能给出确切的编译器错误消息与它引用的确切代码行吗? – 2011-02-25 03:35:24

+0

阅读完文档后,这实际上是正确的答案。谢谢。 – 2011-02-25 04:19:47

1

鉴于existingstr.c_str()是造成Cannot convert from LPCWSTR to LPCSTR你必须定义UNICODE进行编译。使用LPCWSTR而不是LPCSTR为你传递给运API帕拉姆:

LPCWSTR str = existingstr.c_str();

无论如何,CString的有一些不错的转换构造函数:

CStringA strA(existingstr.c_str());

可以传递strA任何想要的LPCSTR

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”解决你的问题是宽字符字符串:

+0

WinAPI函数需要一个LPCSTR,而不是LPCWSTR。 – 2011-02-25 03:22:45

+0

在unicode构建中采用LPCSTR的WinAPI函数很少见。它有什么功能? – 2011-02-25 03:24:37

+0

'GetProcAddress'就是一个例子,我不知道它是否是Charles试图使用的。 – 2011-02-25 03:34:45

4

我WCHAR和基于炭​​字符串之间来回转换时使用以下两个程序:

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)中)。

但是,假设由于兼容性原因不可能,它确实会给您一些关于需要发生的事情的信息。

相关问题