3人も回答していただけるとは…
いろいろと勉強不足で、書かれている内容を調べながら理解していたらずいぶん時間がかかってしまいました。
>>std::basic_string<TCHAR> 用に多重定義したGetWindowText関数を作れば、面倒でもないでしょう。
初心者なりに頑張って考えてみました。
厚かましいようですが、直すべき点を指摘していただけないでしょうか。
int GetWindowText( HWND p_hWnd, std::basic_string<TCHAR> *p_pcStr )
{
int iLength = GetWindowTextLength( p_hWnd );
if( iLength <= 0 )
return 0;
TCHAR *ptch = new TCHAR[iLength + 1];
if( GetWindowText( p_hWnd, ptch, iLength + 1 ) <= 0 )
return 0;
p_pcStr->assign( ptch, ptch + iLength );
delete[/url] ptch;
return iLength;
}
>>文字列がそんなに長くないことがわかっているなら、_alloca等を使うという手もありますね。
スタックに割り当てる関数なんてあったんですね。すごく便利です!
>>std::vector<TCHAR>使うのが定石ですね。
&v[0]をポインタとして使っても良いだなんて驚きです。勉強になります!
std::vector<TCHAR> cVector;
std::basic_string<TCHAR> cStr;
int iLength = GetWindowTextLength( hWnd );
if( iLength <= 0 )
return 0;
cVector.resize( GetWindowTextLength( hWnd ) + 1 );
if( GetWindowText( hWnd, &cVector[0], GetWindowTextLength( hWnd ) + 1 ) <= 0 )
return 0;
cStr.assign( &cVector[0], &cVector[0] + GetWindowTextLength( hWnd ) );
↑Yuoさんはこんな感じでやるんでしょうか?
>>std::basic_string に格納しなくても構わないというのであれば、スコープアウトするときに delete[/url] してくれるクラスを作るか、もしくはそういったライブラリ (Boost の scoped_array など)を探してきて使うのがいいでしょうね。
調べたらstd::auto_ptrが出てきました。でもdelete[/url]には対応してないんですね。やはり自作でしょうか。
>>そういうとき、自分ならこういうクラスを作ります
わざわざこんな長いコードを書いてくださってありがとうございます。
explicit、const、assert等色々勉強させて頂きました。
>>あと _alloca を使う方法もありますが、ATL を使っていいような環境なら、_alloca よりは _ATL_SAFE_ALLOCA を使った方がいいですね。
_allocaには安全性面で弱点があったんですね。。。
便利なので使い倒そうと思っていたんですが、、、確保する領域が小さい時だけに限るようにします。
_allocaについて調べて疑問に思ったのですが、
_allocaで動的にスタックから領域を確保できるなら、どうしてCの配列は静的配列にする必要があったんでしょうか?
動的配列のほうが断然便利だと思うのですが。
ところで、皆さんが苦労して得た知識を素人が簡単に教えてもらうのはどうかと思えてきました。
このまま質問していていいんでしょうか?