CStringからLPTSTR – プログラミング – Home

通知
すべてクリア

[解決済] CStringからLPTSTR


りもん
 りもん
(@りもん)
ゲスト
結合: 22年前
投稿: 29
Topic starter  

こんにちは、環境はWinXP VC7 MFC SDIです。
何度も同じような質問で恐縮です。

リストコントロールでLVITEM構造体を使ってITEMを登録するとき
メンバ変数のLPTSTR pszTextにCStringのインスタンスの文字列をコピーしたいのですが
型が違うためできません。
ここのサイトにCStringからcharの変換が紹介されていたので今は一度
charに変換してからpszTextに代入しています。

CStringからcharに変換
(引用です)
CString str = test;

char *p = new char[str.GetLength()+1];
strcpy( p, str );

delete [] p;

一応これで問題なく動くのですが
CStringが使えるLVITEMに似たものとか、もっと簡単にCStringからLPTSTRに直接
変換できる方法があれば教えて頂けないでしょうか。


引用未解決
トピックタグ
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 22年前
投稿: 178
 

 GetBufferをつかうとか、、、
http://www.microsoft.com/JAPAN/developer/library/vcmfc/_mfc_cstring.3a3a.getbuf
fer.htm


返信引用
りもん
 りもん
(@りもん)
ゲスト
結合: 22年前
投稿: 29
Topic starter  

ありがとうございます。
GetBufferでうまくいきました

それで、疑問に思ったのですが、

CDocで宣言している

private:
CString str;

を同じCDocの

public:
CString Getstr(void)
{
return str;
}
という関数を使って別のクラスから扱っていたのですが
LPTSTR pszText;
pszText=pDoc->Getstr().GetBuffer();

とやると
pszTextを表示させた時にフフフフフフフフ等と文字化けしてしまいます、

それを
LPTSTR pszText;
CString str2=pDoc->Getstr();
pszText=pDoc->str2.GetBuffer();

とやるとうまくいったのですがなぜでしょうか?


返信引用
Eighty
 Eighty
(@Eighty)
ゲスト
結合: 22年前
投稿: 6
 

キャストしたの方が簡単だと思います。

item.pszText = (LPTSTR)(LPCTSTR)str;


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 10
 

> private:
> CString str;
>
> public:
> CString Getstr(void)
> {
> return str;
> }
これでは、strは一時的にCString型を返しますので、

> LPTSTR pszText;
> pszText=pDoc->Getstr().GetBuffer();
とやった時点で、一時的に pszText に LPCTSTR 型のものが
入ります(const_castした方が望ましいけど。)が、この行を
通過した後に、pDoc->Getstr().GetBuffer(); はインスタンス
が消滅しますので、pszText の指し示す先は未定義になります。

> pszTextを表示させた時にフフフフフフフフ等と文字化け
1バイトカナでフフフとなるのは、VC++でデバッグモードの時、
未定義の領域であることを示しています。

そこで、そのような場合は、
CString str2=pDoc->Getstr();
と、インスタンスに値を代入した後、
LPTSTR pszText;
pszText=pDoc->str2.GetBuffer(0);
等とします。

str2は、GetBuffer()した後、次のCStringのメンバ関数を使用
する前に、ReleaseBuffer()し忘れないようにして下さい。

また、pszTextで、値を変更しないのであれば、
LPTSTR pszText;
pszText=const_cast<LPTSTR>(static_cast<LPCTSTR>(pDoc->str2));
等とするほうが便利です。


返信引用
りもん
 りもん
(@りもん)
ゲスト
結合: 22年前
投稿: 29
Topic starter  

皆さんありがとうございます。

>キャストしたの方が簡単だと思います。
> item.pszText = (LPTSTR)(LPCTSTR)str;

こんな事もできるのですか、LPCTSTR等、よく理解してませんでした、、
やっぱりC,C++の基本をもっとやらないとダメですね。

> LPTSTR pszText;
> pszText=pDoc->Getstr().GetBuffer();
>とやった時点で、一時的に pszText に LPCTSTR 型のものが
>入ります(const_castした方が望ましいけど。)が、この行を
>通過した後に、pDoc->Getstr().GetBuffer(); はインスタンス
>が消滅しますので、pszText の指し示す先は未定義になります。

pszTxtはポインタなので指示すBuffをどこかにとっておかないといけなくて
関数の戻り値を代入するのではだめという事ですよね
とてもわかり易かったです。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました