• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CString から LPCTSTRの型に変換)

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

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

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答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 関数を呼び出す為であれば文字コード変換はそもそも必要ないと思います。

回答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% (2173/4061)
回答No.1

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

sofikkohouse
質問者

お礼

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