質問

可能な重複:
Lptstrをcharに変換する*

私は変換する必要があります LPTSTR pCHAR 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文字列です。それがUnicodeであるかどうかによって異なります。Lptstrは、Unicodeでない場合はchar*、そうである場合は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に変換する*

他のヒント

LPTSTR を意味します。 TCHAR* (これらのWin32頭字語のtypedefを拡張すると、それらを理解しやすくなります)。 TCHAR に展開されます char ANSI/MBCSビルドでは、次のようになります wchar_t Unicodeビルド(より良い国際化サポートのためにこれらの日のデフォルトであるべきです)。

次の表は、次の表の概要です 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] の配列です charANSIと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への変換は非可逆である可能性があります.

まず、定義しました char* ch[MAX_PATH] の代わりに char ch[MAX_PATH].

あなたの質問に関しては、LPTSTR(TCHAR文字列への長いポインタ)は以下と等価である。 LPWSTR (これは w_char*)それがunicodeの場合、または単に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:Windowsでは、次を使用することをお勧めします TCHAR の代わりに char.それはあなたにいくつかの頭痛を保存します。

編集3:補足として、Visual Studioが安全でない関数に関する警告であなたをあふれさせないようにしたい場合は、コードの最初に次のようなものを追加することがで:

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top