質問: new tchar[siz]; _tcscpy_s( pszfname, siz, str ); で変換するのですが lpctstrからwchar_t*へ変換できませんとエラーがでます _tcscpy_s()は使用できないのでしょうか
回答: (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 関数を呼び出す為であれば文字コード変換はそもそも必要ないと思います。