CStringからLPCTSTRの型に変換する方法

このQ&Aのポイント
  • visual studio 2013 VC++を使用していますが、WINDOWSの関数に渡すためにCStringからLPCTSTRに変換する必要があります。
  • 以下のサンプルコードを使用してCStringをLPCTSTRに変換することができます。
  • LPCTSTRからwchar_t*への変換でエラーが発生しているようです。_tcscpy_s()関数は使用できません。
回答を見る
  • ベストアンサー

CString から LPCTSTRの型に変換

visual studio 2013 VC++を使用していますが、WINDOWSの関数に渡すためにCString からLPCTSTRに変換する必要があります。実際にどのようにするのかわかりません。 例えば、以下のサンプルは他の質問コーナーの回答をアレンジしたものです CString str = _T("ABC"); int siz = str.GetLength()+1; LPCTSTR pszFName = new TCHAR[siz]; _tcscpy_s( pszFName, siz, str ); で変換するのですが LPCTSTRからwchar_t*へ変換できませんとエラーがでます _tcscpy_s()は使用できないのでしょうか

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.4

>APIはCStdioFile の Open()でファイル名を与えるところ APIではないようですが……。 http://msdn.microsoft.com/ja-jp/library/ee247566.aspx ならば、そのままCStringの変数渡せば、よろしく処理してくれると思いますけど。

sofikkohouse
質問者

お礼

ありがとうございます。 その通りのようでした。

その他の回答 (4)

回答No.5

(1) LPTSTR pszFName = new TCHAR[siz]; // ↑ LPCTSTR ではなく LPTSTR です。LPCTSTR は TCHAR const* で LPTSTR が TCHAR* です。つまり、LPCTSTR は "中身を書き換えられない文字列" で、_tcscpy_s の第一引数 TCHAR* (書き換えられる文字列) に渡す事はできません。 (2) しかし、Windows の関数に渡すだけであれば変換する必要はなくて、ただ単に、str.GetBuffer() を Windows の関数の引数に指定するだけで良いと思います(寿命の問題がなければ)。 或いは、単に、 LPCTSTR pszFName = str.GetBuffer(); で、pszFName に str の中身が入ります。 (3) あと、(文字コード) 変換が必要とか必要ないとか言う回答が挙がっていますが、 CString は TCHAR の文字列、 CStringA が char の文字列、 CStringW が wchar_t の文字列 ですので、CString と TCHAR/LPTSTR の間では、文字コード(Unicode <-> MBCS)変換は必要ありません。CString と LPSTR や LPWSTR の間の変換の方が寧ろ必要です。 因みに、Windows の API 関数は、文字列を受け取るどの関数も、TCHAR 版 (例: CreateFile) と char 版 (例: CreateFileA) と wchar_t 版 (例: CreateFileW) の 3 種類が全て定義されています (char/wchar_t 版は A/W を最後につけるだけ)。従って、文字型に応じて対応する版を選んで呼べばいいだけなので、Windows の API 関数を呼び出す為であれば文字コード変換はそもそも必要ないと思います。

  • chie65535
  • ベストアンサー率43% (8526/19383)
回答No.3

_tcscpy_sはマクロ関数です。 _UNICODEマクロが定義されている場合はwcsncpy_s()に _MBCSマクロが定義されている場合は_mbsnbcpy_s()に どれも定義されていない場合はstrncpy_s()に 展開されます。 LPCTSTRは _UNICODEマクロが定義されている場合はconst WCHAR*に _UNICODEマクロが定義されていない場合はconst char*に typedefされています。 _UNICODEマクロ、_MBCSマクロを正しく定義しないと、これらの関数は使えません。 なお、一般的には「_tcscpy_s()は使用すべきでない」とされています。きちんと処理したいならば、以下 http://msdn.microsoft.com/ja-jp/library/cc448053.aspx のような、文字列変換用のAPI関数を用います。

sofikkohouse
質問者

お礼

int MultiByteToWideChar()の関数を参考にさせていただいたのですが、これは変換元がLPCSTRのようで、変換される結果ではないような気がするのですが

  • FoolWord
  • ベストアンサー率73% (14/19)
回答No.2

関数に引き渡すための変換でしたら、LPCTSTRにキャストするだけじゃ駄目でしょうか? CString str = _T("abc"); LPCTSTR pszFileName = (LPCTSTR)str;

sofikkohouse
質問者

お礼

やはり変換できないとエラーになります

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>WINDOWSの関数に渡すためにCString からLPCTSTRに変換する必要があります。 そのAPIの名前と、渡したい文字列の引数はどれになりますか? APIが要求しているのがLPCSTRなら領域確保してコピーする必要はないと思いますが。 # LPTSTRだったら必要ですけど。 >LPCTSTRからwchar_t*へ変換できませんとエラーがでます >_tcscpy_s()は使用できないのでしょうか LPCTSTRは「書き換え不可(禁止)な文字列へのポインタ」です。 よって、_tcscpy_s()などでのコピー先に指定するのは不適切です。 # 書き換え禁止なのですからコピー「先」にはできません。コピー「元」なら可能ですが。

sofikkohouse
質問者

お礼

APIはCStdioFile の Open()でファイル名を与えるところで問題になっています。

関連するQ&A

  • CStringとCByteArrayの変換

    いつもお世話になっています。 MFCのCStringクラスとCByteArrayを相互に変換したいと考えているのですが、どうもうまくいきません。 文字コードはユニコードを想定しています。 ====================================================== CByteArray data; CString cs1 = _T("あいうえお"); CString cs2; LPBYTE lpByte = (LPBYTE)(LPCTSTR)cs1.GetBuffer(); data.SetSize(cs1.GetLength() * sizeof(TCHAR)); CopyMemory(data.GetData(), lpByte, data.GetSize()); cs1.ReleaseBuffer(); cs2 = (LPCTSTR)data.GetData(); AfxMessageBox(cs2); ====================================================== (現在の出力状況) あいうえお・・・・ 文字は正しく出力されますが、語尾に文字化けしたようなものがつきます。 他に良い方法があればよろしくお願いします。

  • VC++2005で、CString型に16進文字列を入れたいのですが・・

    VC++2005で、CString型に16進文字列を入れたいのですが・・・ 次のようなエラーが出ます。 void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)' : 1 番目の引数を 'const char [5]' から 'const wchar_t *' に変換できません。 プログラムは次の通りです。 CString strBuff; CString strWork; TCHAR tszBuff[80]; UINT unLength; UINT un1; unLength = 5; strBuff = "12345"; _tcscpy(tszBuff, strBuff); strWork = ""; for(un1 = 0; un1 < unLength; un1++) { strWork = strWork + strBuff.Format("%02x", tszBuff[un1]); ←ここにエラーがあると言われています。 } 結果は、strWorkに、"3132333435"となるようにしたい! ネットで探したら、 >UNICODEを使われているのだと思われます。 >T("")マクロを使ってワイドキャラクタに変換するように指示すれば動くと思います。 とあったので、 strWork = strWork + strBuff.Format(_T("%02x"), tszBuff[un1]); としてみたのですが、 二項演算子 '+' : 型 'void' の右オペランドを扱う演算子が見つかりません (または変換できません)。 というエラーが表示されました。 VC++6.0を半年かじり、今日、初めてVC++2005に触った程度の初心者です。 どなたか助言を頂ければ幸いです。 環境  Windows XP Pro SP3  Visual C++ 2005(MFC) 以上、よろしくお願いします。

  • CStringをLPCTSTRへ変換

    お世話になっております。 VC2005を使用しております。 現在、CFileDialogのGetPathName(CString型)で設定された ファイル名に、CImage.save(LPCTSTR型)を使用して画像を保存したい と思っております。 しかし、CString型をLPCTSTR型に変換する方法がわかりません。 方法を教えていただけないでしょうか? 今は、GDI+を使用してませんが、やはり今後の事を考えると使用して ソフトを組んだほうがよいのでしょうか? よろしくお願いします。

  • CStringをwchar_tに変換したい

    CStringをwchar_tに変換したく思い、ネットで探したところ、 http://msdn2.microsoft.com/ja-jp/library/ms235631(VS.80).aspx のページを見つけたので、下記のプログラムを組んで実行してみましたがエラーになって しまいます。 【プログラム】 CString orig("Hello, World!"); // Convert to a char* const size_t newsize = 100; // Convert to a wchar_t* // You must first convert to a char * for this to work. size_t origsize = strlen(orig) + 1; size_t convertedChars = 0; wchar_t wcstring[newsize]; mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE); 【エラー】 error C2664: 'strlen' : 1 番目の引数を 'CString' から 'const char *' に変換できません。 error C2664: 'mbstowcs_s' : 4 番目の引数を 'CString' から 'const char *' に変換できません。 &CStrinをconst char *でキャストしてもうまくいきません。 どこがおかしいのでしょうか? 【環境】 WindowsXP+VC++2005

  • charからLPTSTRへの変換方法

    リストコントロールにchar型の変数の値を数値として表示させたいのですが、charからLPTSTRへの洗練された変換方法がよくわからないです。 char tempChar; CString tempString; tempString.Format("%s", tempChar); LPTSTR lpsz = new TCHAR[tempString.GetLength()+1]; _tcscpy(lpsz, tempString); こんなプログラムを考えてみたのですが、汚いような気がします。もっと簡単で洗練された変換方法はないのでしょうか?

  • UTF8→ShiftJISに変換したいです!

    VC++2010, MFCです。 参考ページ(↓)でできそうだったのですが、 http://www.sutosoft.com/oldroom/devdiary/20020504.html UTF-8からShift_JISにしたいのは、メディアプレーヤーで作られた wpl ファイルも扱いたいからです。 具体的にいうと、ファイル一覧に プレイリストがあった場合、展開してメディアプレイヤーで開いて、再生後 【m3u ファイル】に(コーディングで)アウトプットするのが目的です。 ShiftJISに変換して、いったんファイルに出力してから、再度読込処理を行ってもかまいません。 BOOL C○○Dlg::UTF8ToShiftJIS(const CString& src, CString* dest) {  int sizeOfString = (src.GetLength() + 1);  LPWSTR lpsz = new WCHAR[sizeOfString];  //LPSTR lpsz = new char[ sizeOfString ];  _tcscpy_s(lpsz, sizeOfString, src);    //strcpy_s(lpsz,sizeOfString, src);  //delete[] lpsz //http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200612/06120010.txt //char* orig = "Hello, World"; char* nstring; nstring = new char[sizeOfString]; strcpy_s(nstring,sizeOfString, (LPCSTR)(lpsz)); // ●UTF8からUnicodeに変換した場合の長さを求める。●  //http://msdn.microsoft.com/ja-jp/library/cc448053.aspx  //const_cast<LPTSTR>(static_cast<LPCTSTR>(str)  int iWideLength = ::MultiByteToWideChar(CP_UTF8, 0,【1】nstring, src.GetLength(), NULL, 0);  if (iWideLength == 0)return FALSE;  LPWSTR lpWideString = new WCHAR[iWideLength];  int iLength;  if (    // ●UTF8からUnicodeに変換する。●    (::MultiByteToWideChar(CP_UTF8, 0, 【2】nstring, src.GetLength(), lpWideString, iWideLength) == 0)    // ●UnicodeからShift_JISに変換した場合の長さを求める。●    || ((iLength = ::WideCharToMultiByte(CP_ACP, 0, lpWideString, iWideLength, NULL, 0, NULL, NULL)) == 0)    // ●UnicodeからShift_JISに変換する。●        //http://msdn.microsoft.com/ja-jp/library/cc448089.aspx    || (::WideCharToMultiByte(CP_ACP, 0, lpWideString, iWideLength, 【3】(LPSTR)dest->GetBuffer(iLength), iLength, NULL, NULL) == 0)){    // ●変換に失敗●    delete lpWideString;    return FALSE;  }  // ●変換に成功●  delete lpWideString;  dest->ReleaseBuffer();  return TRUE; } ・・・という風に少し修正をして、次のソースで呼び出しています。  CString src;  CFile file;  if (file.Open(FilePath, CFile::modeRead)){   DWORD iLength = file.GetLength();   //CString src;   file.Read(src.GetBuffer(iLength), iLength);   file.Close();   src.ReleaseBuffer(iLength);   CString dest;   if (UTF8ToShiftJIS(src, &dest) ==TRUE){    MessageBox (dest);   }   // ●この時点で、destにShift_JISに変換された文字列が格納されている。  } 以下(↓)を参考に、【1】~【3】の部分で、他のパターンもキャストしてみたのですが・・・ /* http://d.hatena.ne.jp/shikaku/20090519/p3 ■[CPP][VC]LPCSTRなどのVC++の紛らわしい定義の意味 一見正体不明のVC++オリジナル定義。よーくみれば違いが分かる。名前 意味 LP *(ポインタ) C const TSTR TCHAR(char) STR char WSTR WCHAR(ユニコード用:2byte) ゆえに定義 正体 LPSTR char* LPCSTR const char* LPTSTR TCHAR* LPCTSTR const TCHAR* LPWSTR WCHAR* LPCWSTR const WCHAR* となる。+/ できるだけスマートに記述したいです。エクセル版を作っていたときは、CreateObject("ADODB.Stream")を使っていたみたいです。ただ、VC++でどう書けばいいか、分かりませんυ UTF8→UTF16→ShiftJIS ←これは、あまり、使いたくない 変換 です。 後は、これも参考になりそうですが、 http://www.softist.com/programming/sjis-utf8/sjis-utf8.htm bufUTF8を何型でどこで宣言すればいいのか?分かりません。 これも(↓)はてなです。 http://www.s-cradle.com/developer/sophiaframework/sf_reference/ref.SFXTextEncoding.html 何回も試しましたが、TRUEが返ってきても、変換前と変換後をMessageBoxで比べてみても、変わりがなく、漢字や記号の羅列でしかありません。どうか教えてください。

  • _tcscat がうまくいきません(VC++2008)

    以下のように入力し、ビルドすると 「error C2664: 'wcscat' : 1 番目の引数を 'LPCTSTR' から 'wchar_t *' に変換できません。」となり、うまくいきません。 ダイアログに「テストです。」と表示させたいです。一体どうしたらよいのでしょうか?ご教授ください~。 環境は、WindowsXP SP2 & Visual C++ 2008 Express Edition です。 なお、文字セットは「Unicode 文字セットを使用する」に設定してあります。 //----------------------------------------------------------- #include <Windows.h> #include <tchar.h> INT WINAPI WinMain( HINSTANCE hInst,HINSTANCE,LPSTR,INT){ LPCTSTR str1 = _T("テスト"); LPCTSTR str2 = _T("です。"); _tcscat( str1, str2 ); MessageBox(NULL,str1,_T("Dialog"),MB_OK); return 0; }

  • CString: 識別子が見つかりません

    開発環境:Visual c++ 2008 Express Edion OS:Win XP Pro 次のエラーが表示されていて解決できません。 エラー内容は 1>d:\vc_source\dump\dump\Form1.h(448) : error C3861: 'CString': 識別子が見つかりませんでした です。 ちなみにinclude文は以下です。 #include <Windows.h> #include <stdio.h> #include <stdlib.h> #include <tchar.h> #include <string> #include <cstring> やりたいことは String型からCString型を経由して、TCHAR型へ変換することです。またはその逆方法の変換です。そのためにCString型は必要になるのですが、そこでコンパイルエラーになっています。 知っているかがおりましたら、教えて下さい。

  • CString ←→ BSTRの変換について

    次のコードのように、CString ←→ BSTRの変換を行いたいのですが、データがUTF8だと文字化けしてしまいます。 どうすれば良いでしょうか? 環境:VC++7(.net 2003)+MFC+WinXP 【結果】 CString-------------------------- FFFFFFE2 FFFFFF97 FFFFFF8B 3C BSTR-------------------------- FFFFFFE2 FFFFFF97 FFFFFF81 45 【ソース】 int intCT; int nSize = 0; BYTE *pSource = (BYTE *)"○<"; this->ConvSJistoUtf8(pSource, (BYTE *)NULL, &nSize ); BYTE* pDist = new BYTE[ nSize + 1 ]; ZeroMemory( pDist, nSize + 1 ); this->ConvSJistoUtf8(pSource, pDist, &nSize ); CString str = CString(pDist); delete []pDist; pDist = NULL; BSTR bstr; bstr=str.AllocSysString();//CString→BSTRへの変換 CString str2=CString(bstr);//BSTR→CStringへの変換 TRACE("CString--------------------------\n "); for( intCT = 0; intCT < str.GetLength(); intCT++ ) { if( intCT%16 == 0 ) TRACE("\n"); TRACE("%02X " , str[intCT]); } TRACE("\n "); TRACE("BSTR--------------------------\n "); for( intCT = 0; intCT < str2.GetLength(); intCT++ ) { if( intCT%16 == 0 ) TRACE("\n"); TRACE("%02X " , str2[intCT]); } TRACE("\n "); BOOL ConvSJistoUtf8( BYTE* pSource, BYTE* pDist, int* pSize ) { *pSize = 0; //ShiftJISからUTF-16へ変換 const int nSize = ::MultiByteToWideChar( CP_ACP, 0, (LPCSTR)pSource, -1, NULL, 0 ); BYTE* buffUtf16 = new BYTE[ nSize * 2 + 2 ]; ::MultiByteToWideChar( CP_ACP, 0, (LPCSTR)pSource, -1, (LPWSTR) buffUtf16, nSize ); //UTF-16からShift-JISへ変換 const int nSizeUtf8 = ::WideCharToMultiByte( CP_UTF8, 0, (LPCWSTR) buffUtf16, -1, NULL, 0, NULL, NULL ); if( !pDist ){ *pSize = nSizeUtf8; delete buffUtf16; return TRUE; } BYTE* buffUtf8 = new BYTE[ nSizeUtf8 * 2 ]; ZeroMemory( buffUtf8, nSizeUtf8 * 2 ); ::WideCharToMultiByte( CP_UTF8, 0, (LPCWSTR)buffUtf16, -1, (LPSTR) buffUtf8, nSizeUtf8, NULL, NULL ); *pSize = lstrlen( (char*)buffUtf8 ); memcpy( pDist, buffUtf8, *pSize ); delete buffUtf16; delete buffUtf8; return TRUE; }

  • WORD型をCString型に変換する方法

    WORD型をCString型に変換する方法について質問させていただきました。 WORD型の中身は整数値が入っておりその整数の値をCStringに変換する方法がわからなかったので質問させていただきました。 VC++2010を使用しており、困っています。どうかよろしくお願いします