dポイントプレゼントキャンペーン実施中!

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()は使用できないのでしょうか

A 回答 (5件)

>APIはCStdioFile の Open()でファイル名を与えるところ



APIではないようですが……。

http://msdn.microsoft.com/ja-jp/library/ee247566 …
ならば、そのままCStringの変数渡せば、よろしく処理してくれると思いますけど。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/08/21 15:35

(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 関数を呼び出す為であれば文字コード変換はそもそも必要ないと思います。
    • good
    • 6

_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 …

のような、文字列変換用のAPI関数を用います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/08/21 15:28

関数に引き渡すための変換でしたら、LPCTSTRにキャストするだけじゃ駄目でしょうか?



CString str = _T("abc");
LPCTSTR pszFileName = (LPCTSTR)str;
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/08/21 15:11

>WINDOWSの関数に渡すためにCString からLPCTSTRに変換する必要があります。



そのAPIの名前と、渡したい文字列の引数はどれになりますか?
APIが要求しているのがLPCSTRなら領域確保してコピーする必要はないと思いますが。
# LPTSTRだったら必要ですけど。

>LPCTSTRからwchar_t*へ変換できませんとエラーがでます
>_tcscpy_s()は使用できないのでしょうか

LPCTSTRは「書き換え不可(禁止)な文字列へのポインタ」です。
よって、_tcscpy_s()などでのコピー先に指定するのは不適切です。
# 書き換え禁止なのですからコピー「先」にはできません。コピー「元」なら可能ですが。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/08/21 15:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A