C++ :convertir LPTSTR en tableau de caractères [dupliquer]
-
12-12-2019 - |
Question
Doublon possible :
Convertir lptstr en char*
J'ai besoin de convertir un LPTSTR p
à CHAR ch[]
.Je suis nouveau 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;
}
Merci d'avance.
La solution
LPTSTR est une chaîne TCHAR (non const).Cela dépend si c'est Unicode ou non, il apparaît.LPTSTR est char* si ce n'est pas Unicode, ou w_char* si c'est le cas.
Si vous utilisez des chaînes non Unicode, LPTSTR n'est qu'un caractère*, sinon faites :
size_t size = wcstombs(NULL, p, 0);
char* CharStr = new char[size + 1];
wcstombs( CharStr, p, size + 1 );
De plus, ce lien peut aider :
Autres conseils
LPTSTR
moyens TCHAR*
(l'extension des typedefs de ces acronymes Win32 peut faciliter leur compréhension). TCHAR
s'étend à char
dans les versions ANSI/MBCS, et pour wchar_t
dans les versions Unicode (ce qui devrait être la valeur par défaut de nos jours pour une meilleure prise en charge de l'internationalisation).
Ce tableau résume les TCHAR
extensions dans les versions ANSI/MBCS et Unicode:
| ANSI/MBCS | Unicode
--------+----------------+-----------------
TCHAR | char | wchar_t
LPTSTR | char* | wchar_t*
LPCTSTR | const char* | const wchar_t*
Ainsi, dans les versions ANSI/MBCS, LPTSTR
s'étend à char*
;dans les versions Unicode, il s'étend à wchar_t*
.
char ch[MAX_PATH]
est un tableau de char
est dans les versions ANSI et Unicode.
Si vous souhaitez convertir à partir d'un TCHAR
chaîne (LPTSTR
) en une chaîne ANSI/MBCS (char
-basé), vous pouvez utiliser Aides à la conversion de chaînes ATL, par exemple.:
LPTSTR psz; // TCHAR* pointing to something valid
CT2A ch(psz); // convert from TCHAR string to char string
(Notez également que dans votre code d'origine, vous devez appeler CString::ReleaseBuffer()
qui est la symétrique de CString::GetBuffer()
.)
Exemple de code suit :
// 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;
Notez également que la conversion d'Unicode en ANSI peut entraîner des pertes.
Tout d'abord, vous avez défini char* ch[MAX_PATH]
au lieu de char ch[MAX_PATH]
.
Concernant votre question, LPTSTR (Pointeur long vers la chaîne TCHAR) est équivalent à LPWSTR
(lequel est w_char*
) si c'est Unicode, ou simplement LPSTR (char*
) si ce n'est pas le cas.Vous pouvez utiliser ce lien pour référence sur la conversion dans chaque cas.
MODIFIER:Pour aller droit au but, voici un peu de code :
if (sizeof(TCHAR) == sizeof(char)) // String is non-unicode
strcpy(ch, (char*)(p));
else // String is unicode
wcstombs(ch, p, MAX_PATH);
MODIFIER 2:Sous Windows, je recommanderais d'utiliser TCHAR
au lieu de char
.Cela vous évitera quelques maux de tête.
MODIFIER 3:En remarque, si vous souhaitez éviter que Visual Studio ne vous inonde d'avertissements concernant des fonctions dangereuses, vous pouvez ajouter quelque chose comme ce qui suit au tout début de votre code :
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif