C++:convertir LPTSTR a matriz de caracteres [duplicado]
-
12-12-2019 - |
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.
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:
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 char
Está 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