3

重複の可能性:
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;
}

前もって感謝します。

4

3 に答える 3

6

LPTSTRは(非定数)TCHAR文字列です。Unicodeであるかどうかによって異なります。LPTSTRは、Unicodeでない場合はchar *であり、Unicodeの場合はw_char*です。

Unicode以外の文字列を使用している場合、LPTSTRは単なるchar *です。それ以外の場合は、次のようにします。

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

また、このリンクは次のことに役立ちます。

lptstrをchar*に変換します

于 2012-05-21T09:26:01.850 に答える
2

まず、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:WindowsTCHARでは、の代わりに使用することをお勧めしcharます。それはあなたにいくらかの頭痛を救うでしょう。

編集3:補足として、Visual Studioが安全でない関数に関する警告でいっぱいになるのを防ぎたい場合は、コードの最初に次のようなものを追加できます。

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
于 2012-05-21T09:14:26.017 に答える
2

LPTSTR意味しますTCHAR*(これらのWin32頭字語typedefを拡張すると、理解しやすくなります)。ANSI / MBCSビルド、およびUnicodeビルドにTCHAR拡張されます(これは、より良い国際化サポートのために最近のデフォルトであるはずです)。charwchar_t

TCHARこの表は、 ANSI/MBCSおよびUnicodeビルドの拡張をまとめたものです。

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

したがって、ANSI / MBCSビルドでは、にLPTSTR拡張されchar*ます。Unicodeビルドでは、に展開されwchar_t*ます。

char ch[MAX_PATH]charは、 ANSIビルドとUnicodeビルドの両方の'の配列です。

TCHAR文字列(LPTSTR)からANSI / MBCS文字列(charベース)に変換する場合は、ATL文字列変換ヘルパーを使用できます。

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;

UnicodeからANSIへの変換は不可逆になる可能性があることにも注意してください。

于 2012-05-21T10:35:36.033 に答える