Me han metido un WCHAR[MAX_PATH] de (PROCESSENTRY32) pe32.szExeFile en Windows. Los siguientes no funcionan:

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

y

std::string s;
char DefChar = ' ';
WideCharToMultiByte(CP_ACP,0,pe32.szExeFile,-1, ch,260,&DefChar, NULL);
s = pe32.szExeFile;
  • ¿Usted realmente necesita como un std::string? Se debe convertir directamente a un std::wstring, como en std::wstring s(pe32.szExeFile);
InformationsquelleAutor user1334943 | 2012-04-18

4 Comentarios

  1. 1

    Su llamada a WideCharToMultiByte parece correcto, siempre ch es un
    búfer de tamaño suficiente. Después de que, sin embargo, que desea asignar a la
    buffer (ch) a la cadena (o utilizarlo para construir una cadena), no
    pe32.szExeFile.

  2. 3

    Para el primer ejemplo que usted puede hacer:

    std::wstring s(pe32.szExeFile);

    y para el segundo:

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

    como std::wstring tiene un char* cto r

    • Ni el trabajo mismo error. error: C2664: ‘std::basic_string<_Elem,_Traits,_Ax>::basic_string(std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it)’ : no se puede convertir el parámetro 1 de ‘WCHAR [260]’ a ‘std::basic_string<_Elem,_Traits,_Ax>
    • lo siento, debería haber utilizado wstring versión, debe compilar ahora
    • funciona con std::wstring s(&pe32.szExeFile)?
  3. 2

    No son convenientes la conversión de las clases de ATL; puede que desee utilizar algunos de ellos, por ejemplo:

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

    Nota, sin embargo, que una conversión de Unicode UTF-16 ANSI puede ser con pérdida. Si desea un sin pérdida de calidad de la conversión, usted podría convertir de UTF-16 y UTF-8, y la tienda de UTF-8 en el interior de std::string.

    Si usted no desea utilizar ATL, hay algunos conveniente disponible gratuitamente en C++ contenedores de raw Win32 WideCharToMultiByte a convertir de UTF-16 y UTF-8 uso de la STL cadenas.

  4. 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();
    
    }

    y utilizar esta plantilla como seguido

    PWSTR CurWorkDir;
    std::string CurWorkLogFile;
    
    CurWorkDir = new WCHAR[length];
    
    CurWorkLogFile = string_cast<std::string>(CurWorkDir);
    
    ....
    
    
    delete [] CurWorkDir;

Dejar respuesta

Please enter your comment!
Please enter your name here