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も見ています
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
charからLPTSTRへの変換方法
C言語・C++・C#
-
-
4
CStringをwchar_tに変換したい
C言語・C++・C#
-
5
画面を強制的に再描画させる方法
C言語・C++・C#
-
6
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
7
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
8
CString型の文字列連結について
C言語・C++・C#
-
9
CStringの文字列検索&抜き出しについて
C言語・C++・C#
-
10
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
11
適切な変換関数が存在しない???
C言語・C++・C#
-
12
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
13
error C2664: 'LPCTSTR' に変換できません。
C言語・C++・C#
-
14
Debug Assertion Failed?
C言語・C++・C#
-
15
WaitForSingleObjectの使い方について
C言語・C++・C#
-
16
CString型 全角半角を意識せずに「1文字」ずつ取り出す
C言語・C++・C#
-
17
エディットボックスの入力制限について
C言語・C++・C#
-
18
文字列の置換をCStringで(C++)
C言語・C++・C#
-
19
LPSTR型の初期化について
C言語・C++・C#
-
20
VC++で文字列から任意の文字を削除するにはどうしたらいいですか?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CString から LPCTSTRの型に変換
-
文字コードの%E3%80%とは何です...
-
Excel VBAでPDFファイルをMicro...
-
Visual Studio プロパティペー...
-
改行を含んだ文字列を正規表現...
-
シャープ(#)の受け渡し
-
SJIS->UTF8->SJISコード変換に...
-
VB6にも「ToString」ってあり...
-
html内のカタカナを全て全...
-
VBScript文字列をSJISからUTF8...
-
テキストをhtml変換するには
-
ローマ数字の変換をしたいのですが
-
CSVファイルの中で、「 , 」カ...
-
エクセルで数値を全角文字(カ...
-
これは大きなお世話ですよね? ...
-
EXCELからCSVにすると余計なカ...
-
「何とかで始まり、何とかで終...
-
マクロを使ってフォルダー内に...
-
COBOL・全角判定
-
英数字のみ全角から半角に変換
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CString から LPCTSTRの型に変換
-
Excel VBAでPDFファイルをMicro...
-
文字コードの%E3%80%とは何です...
-
SJIS->UTF8->SJISコード変換に...
-
SQLのデータで半角カナを全角に...
-
gccでiconvを使った文字コード...
-
テキストをhtml変換するには
-
Visual Studio プロパティペー...
-
Encode.pmで「髙」(ハシゴ高)...
-
ローマ字からカナに変換する方...
-
LINUX上でシリアル通信(C++)
-
VBScript文字列をSJISからUTF8...
-
【PHP】全角記号を半角記号...
-
VB6にも「ToString」ってあり...
-
五十音の並べ替えsortを教えて...
-
これはなんの文字コードでしょうか
-
エクセルでの漢字(全角ひらが...
-
ウイザードからのVBAでクエリー...
-
漢数字の変換
-
文字化けしてしまって困っています
おすすめ情報