Frage

Mögliches Duplikat:
Konvertieren Sie lptstr in char*

Ich muss eine konvertieren LPTSTR p Zu CHAR ch[].Ich bin neu 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;
}

Dank im Voraus.

War es hilfreich?

Lösung

LPTSTR ist eine (nicht konstante) TCHAR-Zeichenfolge.Hängt davon ab, ob es Unicode ist oder nicht.LPTSTR ist char*, wenn nicht Unicode, oder w_char*, wenn ja.

Wenn Sie Nicht-Unicode-Zeichenfolgen verwenden, ist LPTSTR nur ein Zeichen*, andernfalls gehen Sie wie folgt vor:

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

Außerdem kann dieser Link helfen:

Konvertieren Sie lptstr in char*

Andere Tipps

LPTSTR bedeutet TCHAR* (Das Erweitern dieser Win32-Akronym-Typedefs kann das Verständnis erleichtern.) TCHAR erweitert sich auf char in ANSI/MBCS-Builds und zu wchar_t in Unicode-Builds (was heutzutage zur besseren Internationalisierungsunterstützung die Standardeinstellung sein sollte).

Diese Tabelle fasst die zusammen TCHAR Erweiterungen in ANSI/MBCS- und Unicode-Builds:

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

In ANSI/MBCS-Builds gilt also: LPTSTR erweitert sich auf char*;in Unicode-Builds wird es erweitert auf wchar_t*.

char ch[MAX_PATH] ist ein Array von charist sowohl in ANSI- als auch in Unicode-Builds enthalten.

Wenn Sie von a konvertieren möchten TCHAR Zeichenfolge (LPTSTR) in eine ANSI/MBCS-Zeichenfolge (char-basiert), können Sie verwenden Hilfsprogramme zur ATL-Stringkonvertierung, z.B.:

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

(Beachten Sie auch, dass Sie in Ihrem ursprünglichen Code anrufen sollten CString::ReleaseBuffer() welches die Symmetrie von ist CString::GetBuffer().)

Beispielcode folgt:

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

Beachten Sie auch das Die Konvertierung von Unicode nach ANSI kann verlustbehaftet sein.

Zuerst haben Sie definiert char* ch[MAX_PATH] anstatt char ch[MAX_PATH].

Zu Ihrer Frage: LPTSTR (Langer Zeiger auf den TCHAR-String) ist äquivalent zu LPWSTR (welches ist w_char*), wenn es Unicode ist, oder nur LPSTR (char*) wenn es das nicht ist.Sie können verwenden dieser Link als Referenz zur jeweiligen Konvertierung.

BEARBEITEN:Um es auf den Punkt zu bringen, hier ein Code:

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

BEARBEITEN 2:Unter Windows würde ich die Verwendung empfehlen TCHAR anstatt char.Es erspart Ihnen einige Kopfschmerzen.

BEARBEITEN 3:Als Randbemerkung: Wenn Sie verhindern möchten, dass Visual Studio Sie mit Warnungen zu unsicheren Funktionen überschwemmt, können Sie ganz am Anfang Ihres Codes etwas wie das Folgende hinzufügen:

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top