Domanda

Possibile duplicato:
Converti lptstr in carattere*

Ho bisogno di convertire un file LPTSTR p A CHAR ch[].Sono nuovo in 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;
}

Grazie in anticipo.

È stato utile?

Soluzione

LPTSTR è una stringa TCHAR (non const).Dipende se è Unicode o meno, appare.LPTSTR è char* se non è Unicode o w_char* in caso affermativo.

Se stai utilizzando stringhe non Unicode LPTSTR è solo un carattere*, altrimenti esegui:

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

Inoltre, questo collegamento può aiutare:

Converti lptstr in carattere*

Altri suggerimenti

LPTSTR significa TCHAR* (l'espansione dei typedef degli acronimi Win32 può renderne più semplice la comprensione). TCHAR si espande a char nelle build ANSI/MBCS e a wchar_t nelle build Unicode (che dovrebbe essere l'impostazione predefinita in questi giorni per un migliore supporto all'internazionalizzazione).

Questa tabella riassume il TCHAR espansioni nelle build ANSI/MBCS e Unicode:

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

Quindi, nelle build ANSI/MBCS, LPTSTR si espande a char*;nelle build Unicode si espande in wchar_t*.

char ch[MAX_PATH] è un array di charè presente sia nelle build ANSI che Unicode.

Se vuoi convertire da a TCHAR corda (LPTSTR) in una stringa ANSI/MBCS (char-based), è possibile utilizzare Aiutanti per la conversione di stringhe ATL, per esempio.:

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

(Nota anche che nel tuo codice originale dovresti chiamare CString::ReleaseBuffer() che è il simmetrico di CString::GetBuffer().)

Codice d'esempio segue:

// 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;

Nota anche questo la conversione da Unicode ad ANSI può comportare perdite.

Innanzitutto, hai definito char* ch[MAX_PATH] invece di char ch[MAX_PATH].

Per quanto riguarda la tua domanda, LPTSTR (Puntatore lungo alla stringa TCHAR) è equivalente a LPWSTR (che è w_char*) se è unicode o solo LPSTR (char*) se non è.Puoi usare questo link per riferimento sulla conversione in ciascun caso.

MODIFICARE:Per andare al sodo, ecco del codice:

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

MODIFICA 2:In Windows consiglierei di utilizzare TCHAR invece di char.Ti farà risparmiare qualche mal di testa.

MODIFICA 3:Come nota a margine, se vuoi evitare che Visual Studio ti inonda di avvisi su funzioni non sicure, puoi aggiungere qualcosa di simile al seguente all'inizio del tuo codice:

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top