
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()は使用できないのでしょうか
No.4ベストアンサー
- 回答日時:
>APIはCStdioFile の Open()でファイル名を与えるところ
APIではないようですが……。
http://msdn.microsoft.com/ja-jp/library/ee247566 …
ならば、そのままCStringの変数渡せば、よろしく処理してくれると思いますけど。
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 …
のような、文字列変換用のAPI関数を用います。
int MultiByteToWideChar()の関数を参考にさせていただいたのですが、これは変換元がLPCSTRのようで、変換される結果ではないような気がするのですが
No.1
- 回答日時:
>WINDOWSの関数に渡すためにCString からLPCTSTRに変換する必要があります。
そのAPIの名前と、渡したい文字列の引数はどれになりますか?
APIが要求しているのがLPCSTRなら領域確保してコピーする必要はないと思いますが。
# LPTSTRだったら必要ですけど。
>LPCTSTRからwchar_t*へ変換できませんとエラーがでます
>_tcscpy_s()は使用できないのでしょうか
LPCTSTRは「書き換え不可(禁止)な文字列へのポインタ」です。
よって、_tcscpy_s()などでのコピー先に指定するのは不適切です。
# 書き換え禁止なのですからコピー「先」にはできません。コピー「元」なら可能ですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
charからLPTSTRへの変換方法
C言語・C++・C#
-
CStringをwchar_tに変換したい
C言語・C++・C#
-
-
4
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
5
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
6
'int' から 'LPCSTR' に変換できません。
C言語・C++・C#
-
7
CString型 全角半角を意識せずに「1文字」ずつ取り出す
C言語・C++・C#
-
8
ラベル(スタティックテキスト)内での改行。
C言語・C++・C#
-
9
Cstring(日本語含む)をcharに変換したいのですが
C言語・C++・C#
-
10
エディットボックスの入力制限について
C言語・C++・C#
-
11
画面を強制的に再描画させる方法
C言語・C++・C#
-
12
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
13
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
14
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
15
ダイアログの上のテキストボックスの、初期値を設定する方法が分かりません・・・・
C言語・C++・C#
-
16
CStringをLPCTSTRへ変換
C言語・C++・C#
-
17
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
18
CStringの文字列検索&抜き出しについて
C言語・C++・C#
-
19
エディットボックスのフォントを変えたい
C言語・C++・C#
-
20
CString型の文字列連結について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLのデータで半角カナを全角に...
-
文字コードの%E3%80%とは何です...
-
文字コード変換プログラムについて
-
CString型からdouble型への変換
-
tkinter widget ことえり変換で...
-
VBScript 全角英数記号→半角英...
-
漢字からカタカナ変換マクロ
-
CString から LPCTSTRの型に変換
-
エクセルでの漢字(全角ひらが...
-
CSVファイルの中で、「 , 」カ...
-
エクセルで数値を全角文字(カ...
-
英数字のみ全角から半角に変換
-
VBA 置換文字がみつからない時
-
IEからEdgeへの移行に伴うIMEの...
-
データにカンマが入ったCSVデー...
-
VBA 文字に半角が含まれて...
-
char型全角数字から、int型半角...
-
Excel2010 差し込み印刷について
-
Excelについて質問です。 セル...
-
POM
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでPDFファイルをMicro...
-
文字コードの%E3%80%とは何です...
-
CString から LPCTSTRの型に変換
-
SQLのデータで半角カナを全角に...
-
エクセルでの漢字(全角ひらが...
-
CString型からdouble型への変換
-
SJIS->UTF8->SJISコード変換に...
-
エンコードとコンバートの違い...
-
JISとシフトJIS
-
VBScript文字列をSJISからUTF8...
-
漢字からカタカナ変換マクロ
-
あるユニコード文字が、あるコ...
-
テキストをhtml変換するには
-
文字列を quoted-printable 文...
-
マイク取得音声のテキスト変換
-
16進数の文字列を文章に変える
-
dreamweaver タグの設定変更の...
-
日本語ドメインを取得しようと...
-
html内のカタカナを全て全...
-
ファイル名の右側を変更したい ...
おすすめ情報