将WCHAR [260]转换为std :: string

时间:2012-04-18 06:40:21

标签: c++ windows string wchar

我在Windows上从(PROCESSENTRY32)pe32.szExeFile获得了WCHAR [MAX_PATH]。以下不起作用:

std::string s;
s = pe32.szExeFile; // compile error. cast (const char*) doesnt work either

std::string s;
char DefChar = ' ';
WideCharToMultiByte(CP_ACP,0,pe32.szExeFile,-1, ch,260,&DefChar, NULL);
s = pe32.szExeFile;

4 个答案:

答案 0 :(得分:3)

对于您的第一个例子,您可以这样做:

std::wstring s(pe32.szExeFile);

和第二个:

char DefChar = ' ';
WideCharToMultiByte(CP_ACP,0,pe32.szExeFile,-1, ch,260,&DefChar, NULL);
std::wstring s(pe32.szExeFile);

std::wstring有一个char* ctor

答案 1 :(得分:2)

方便conversion classes from ATL;你可能想要使用它们中的一些,例如:

std::string s( CW2A(pe32.szExeFile) );

但请注意,从Unicode UTF-16到ANSI的转换可能有损。如果你不是一个无损转换,你可以从UTF-16转换为UTF-8 ,并将UTF-8存储在std::string内。

如果你不想使用ATL,那么原始的Win32 WideCharToMultiByteconvert from UTF-16 to UTF-8 using STL strings周围有一些方便的免费C ++包装器。

答案 2 :(得分:1)

如果WideCharToMultiBytech,那么您对ch的通话看起来是正确的 足够大的缓冲区。然而,之后,你要分配 缓冲区(pe32.szExeFile)到字符串(或用它来构造一个字符串),而不是 {{1}}。

答案 3 :(得分:1)

#ifndef __STRINGCAST_H__
#define __STRINGCAST_H__

#include <vector>
#include <string>
#include <cstring>
#include <cwchar>
#include <cassert>

template<typename Td>
Td string_cast(const wchar_t* pSource, unsigned int codePage = CP_ACP);

#endif // __STRINGCAST_H__

template<>
std::string string_cast( const wchar_t* pSource, unsigned int codePage )
{
    assert(pSource != 0);
    size_t sourceLength = std::wcslen(pSource);
    if(sourceLength > 0)
    {
        int length = ::WideCharToMultiByte(codePage, 0, pSource, sourceLength, NULL, 0, NULL, NULL);
        if(length == 0)
            return std::string();

        std::vector<char> buffer( length );
        ::WideCharToMultiByte(codePage, 0, pSource, sourceLength, &buffer[0], length, NULL, NULL);

        return std::string(buffer.begin(), buffer.end());
    }
    else
        return std::string();

}

并按照以下方式使用此模板

PWSTR CurWorkDir;
std::string CurWorkLogFile;

CurWorkDir = new WCHAR[length];

CurWorkLogFile = string_cast<std::string>(CurWorkDir);

....


delete [] CurWorkDir;