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.

Était-ce utile?

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 :

Convertir lptstr en char*

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 charest 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top