문제

가능한 중복:
변환 lptstr char*

내가 필요로 변환하 LPTSTR p 하기 CHAR ch[].나는 새로 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;
}

미리 감사드립니다.

도움이 되었습니까?

해결책

LPTSTR 는(비-const)TCHAR 문자열입니다.따라 달라집하는 경우 그것은 유니코드 또는 그렇지가 나타납니다.LPTSTR 이 char*하지 않는 경우 유니코드,또는 w_char*그렇다면.

사용하는 경우에는 비즈-유니코드 문자열 LPTSTR 은 char*,그렇지 않은 경우:

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

또한,이 링크에 도움이 될 수 있습니다:

변환 lptstr char*

다른 팁

LPTSTR 수단 TCHAR* (확장들 Win32 약어 typedef 쉽게 만들 수 있습니다 그것은 그들을 이해). TCHAR 확장 char ANSI/룹 구축하고, wchar_t 에서는 유니코드를 구축(어야 하는 기본에서는 이러한 일을 위해 더 나은 국제화 지원).

이 테이블을 요약 TCHAR 확장 ANSI/룹과 유니코드 구축:

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

그래서,ANSI/룹 구축, LPTSTR 확장 char*;에서는 유니코드를 구축 확장 wchar_t*.

char ch[MAX_PATH] 의 배열 char's 에서 모두 ANSI 및 유니코드를 구축합니다.

변환하려면에서 TCHAR 문자열(LPTSTR 용)ANSI/룹자(char기반),사용할 수 있는 ATL 문자열 변환 helpers, 예:

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

(참고 또한 너의 원래 코드를 호출해야 합니다 CString::ReleaseBuffer() 은 대칭의 CString::GetBuffer().)

샘플 코드 다음과 같:

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

참고하는 것도 변환에서 유니코드하는 ANSI 수 있는 손실.

첫째,당신이 정의 char* ch[MAX_PATH]char ch[MAX_PATH].

에 관한 질문,LPTSTR(긴 포인터를 TCHAR 문자열 이)에 해당하는 LPWSTR (는 w_char*)의 경우 유니코드,또는 LPSTR(char* 경우)그렇지 않습니다.당신이 사용할 수 있는 이 링크 참고를 위한 변환에 대한 각각의 경우에.

편집:로 절단하는 추적이,여기에 몇 가지 코드:

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

편집 2:윈도우에서 나는 사용하는 것이 좋습니다 것 TCHARchar.그것은 당신의 두통입니다.

3 편집:주석으로,을 방지하려면 Visual Studio 에서 홍수와 함께 당신에 대한 경고 안전하지 않은 기능을 추가할 수 있습니다 다음과 같이 매우의 시작 부분의 코드:

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top