Pergunta

Possíveis Duplicados:
Converter lptstr char*

Eu preciso converter um LPTSTR p para CHAR ch[].Eu sou novo para 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;
}

Obrigado antecipadamente.

Foi útil?

Solução

LPTSTR é um (não constante) TCHAR de seqüência de caracteres.Depende se for Unicode ou não aparece.LPTSTR é char* se não Unicode, ou w_char* em caso afirmativo.

Se você estiver usando cadeias Unicode LPTSTR é apenas um char*, caso contrário, fazer:

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

Além disso, este link pode ajudar:

Converter lptstr char*

Outras dicas

LPTSTR significa TCHAR* (ampliando os Win32 siglas typedefs pode torná-lo mais fácil de entender). TCHAR expande-se para char no ANSI/MBCS constrói, e para wchar_t em Unicode compilações (que deve ser o padrão nestes dias para um melhor apoio à internacionalização).

Esta tabela resume as TCHAR expansões em ANSI/MBCS e Unicode cria:

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

Assim, na ANSI/MBCS constrói, LPTSTR expande-se para char*;em compilações do Unicode, expande-se para wchar_t*.

char ch[MAX_PATH] é uma matriz de char's em ANSI e Unicode cria.

Se você deseja converter de um TCHAR string (LPTSTR) para um ANSI/cadeia de caracteres MBCS (char-com), você pode usar ATL de seqüência de caracteres de conversão de ajudantes, por exemplo:

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

(Observe também que, no seu código original, você deve chamar CString::ReleaseBuffer() qual é o simétrico de CString::GetBuffer().)

Código de exemplo 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;

Note-se também que a conversão de Unicode para ANSI pode ser com.

Primeiro, você definidos char* ch[MAX_PATH] em vez de char ch[MAX_PATH].

Em relação à sua questão, LPTSTR (Ponteiro longo para TCHAR Cadeia) é equivalente a LPWSTR (o que é w_char*) se é unicode, ou apenas LPSTR (char*) se não for.Você pode usar este link para referência sobre conversão em cada caso.

EDITAR:Para ir direto ao assunto, aqui está o código:

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

EDIT 2:No windows eu recomendo usar TCHAR em vez de char.Ela vai lhe poupar algumas dores de cabeça.

EDIÇÃO 3:Como uma nota de lado, se você quiser impedir que o Visual Studio a partir de inundações você com avisos sobre funções não seguras, você pode adicionar algo como o seguinte para o início do código:

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top