Pregunta

Posible duplicado:
Convertir lptstr a char*

Necesito convertir un LPTSTR p a CHAR ch[].Soy nuevo en C++.

#include "stdafx.h"
#define _WIN32_IE 0x500
#include <shlobj.h>
#include <atlstr.h>
#include <iostream>
#include <Strsafe.h>

using namespace std;

int main(){
    int a;
    string res;
    CString path;
    char ch[MAX_PATH];
    LPTSTR p = path.GetBuffer(MAX_PATH);
    HRESULT hr = SHGetFolderPath(NULL,CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, p);

/* some operation with P and CH */

    if(SUCCEEDED(hr))
    { /* succeeded */
        cout << ch;
    } /* succeeded */
    else
    { /* failed */
        cout << "error";
    } /* failed */
    cin >> a;
    return 0;
}

Gracias de antemano.

¿Fue útil?

Solución

LPTSTR es una cadena TCHAR (no constante).Depende si es Unicode o no aparece.LPTSTR es char* si no es Unicode, o w_char* si es así.

Si está utilizando cadenas que no son Unicode, LPTSTR es solo un carácter*; de lo contrario, haga lo siguiente:

size_t size = wcstombs(NULL, p, 0);
char* CharStr = new char[size + 1];
wcstombs( CharStr, p, size + 1 );

Además, este enlace puede ayudar:

Convertir lptstr a char*

Otros consejos

LPTSTR medio TCHAR* (ampliar los tipos de acrónimos de Win32 puede hacer que sea más fácil entenderlos). TCHAR se expande a char en compilaciones ANSI/MBCS y para wchar_t en compilaciones Unicode (que debería ser la opción predeterminada en estos días para un mejor soporte de internacionalización).

Esta tabla resume la TCHAR expansiones en compilaciones ANSI/MBCS y Unicode:

          |   ANSI/MBCS    |     Unicode
  --------+----------------+-----------------
  TCHAR   |     char       |     wchar_t
  LPTSTR  |     char*      |     wchar_t*
  LPCTSTR |  const char*   |  const wchar_t*

Entonces, en las compilaciones ANSI/MBCS, LPTSTR se expande a char*;en compilaciones Unicode se expande a wchar_t*.

char ch[MAX_PATH] es una matriz de charEstá en versiones ANSI y Unicode.

Si desea convertir desde un TCHAR cadena (LPTSTR) a una cadena ANSI/MBCS (char-basado), puedes usar Ayudantes de conversión de cadenas ATL, p.ej.:

LPTSTR psz;   // TCHAR* pointing to something valid    
CT2A ch(psz); // convert from TCHAR string to char string

(Tenga en cuenta también que en su código original debe llamar CString::ReleaseBuffer() cual es la simétrica de CString::GetBuffer().)

Código de muestra sigue:

// Include ATL headers to use string conversion helpers
#include <atlbase.h>
#include <atlconv.h>
...

LPTSTR psz = path.GetBuffer(MAX_PATH);
HRESULT hr = SHGetFolderPath(NULL,CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, psz);
path.ReleaseBuffer();
if (FAILED(hr))
{
  // handle error
  ...
}

// Convert from TCHAR string (CString path) to char string.
CT2A ch(path);

// Use ch...
cout << static_cast<const char*>(ch) << endl;

Tenga en cuenta también que la conversión de Unicode a ANSI puede generar pérdidas.

Primero, definiste char* ch[MAX_PATH] en lugar de char ch[MAX_PATH].

Respecto a su pregunta, LPTSTR (Puntero largo a la cadena TCHAR) es equivalente a LPWSTR (cual es w_char*) si es Unicode, o simplemente LPSTR (char*) si no es.Puedes usar este enlace como referencia sobre la conversión en cada caso.

EDITAR:Para ir al grano, aquí hay un código:

if (sizeof(TCHAR) == sizeof(char))  // String is non-unicode
    strcpy(ch, (char*)(p));       
else                                // String is unicode
    wcstombs(ch, p, MAX_PATH);

EDITAR 2:En Windows recomendaría usar TCHAR en lugar de char.Te ahorrará algunos dolores de cabeza.

EDITAR 3:Como nota al margen, si desea evitar que Visual Studio lo inunde con advertencias sobre funciones no seguras, puede agregar algo como lo siguiente al principio de su código:

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top