{magclick}
{magclick}
/*
    KAB-studio.h
        　ＫＡＢ−ｓｔｕｄｉｏで先週更新した内容
        が格納されたヘッダーファイルです（笑）。

    (C)KAB-studio 1999 - 2000 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com

    送信日： 2000/09/11(Mon) No.073
    配信数： 3860（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/
{magclick}

/*              ２０００年９月１１日（月）の更新                  */
http://www.kab-studio.com/

・プログラミング辞書単語受付休止
　プログラミング辞書の単語受付を１週間だけお休みします。理由は、
９月１２日〜１５日にゼミ合宿があって更新とかが大変になるため。１週間
だけがまんしてね〜。


/*                        チョー普通な日記                        */
http://www.kab-studio.com/nikki2/

2000/09/03 (Sun)
　告別式＆初七日。

2000/09/04 (Mon)
　ドラクエとかアニメとか。ブッシュベイビーは名作です。いいなー。

2000/09/05 (Tue)
　ドラクエにプログラミング辞書に表紙描きとフル活動。って、ゼミ合宿の
準備せな……。

2000/09/06 (Wed)
　ギルティギアＸのディズィーってかわいーなーと思うお年頃。あとやっと
こさゼミ合宿準備に着手。

2000/09/07 (Thu)
　ぷらとわ書きとか。ドラクエは初コンテスト。メダルはホント謎だ……。

2000/09/08 (Fri)
　床屋で髪の毛を刈る。うわー怖い人になってしまった（爆）。そして１万
以下デジカメ。さてどれを買うか……。

2000/09/09 (Sat)
　かぶヘッダーの準備したりドラクエしたりゼミ合宿の準備したりＮスペ見
たりと多忙な１日？　そして AIR 。良いのん？


/*                         鏑矢の憂鬱                             */
http://www.kab-studio.com/Programing/KabuU/

2000/09/03 (Sun)
お休み

2000/09/04 (Mon)
お便り
フォルダにパスワードロックをかけたい
難しいと思う
FindFirstFile() を監視できないと
セキュリティ機能はＯＳが限られる
DLL のすり替えや DDK フックを使って監視するか
エクスプローラーだけを監視するか
フォルダ内を圧縮してしまうのがある意味現実的

2000/09/05 (Tue)
プログラミング辞書書き
「ごめんなさい」欄は廃止する方向に

2000/09/06 (Wed)
__RPC_FAR はどこに？
Rpc.h にあった
お便り
コンソールからウィンドウを作成する方法
GetModuleHandle() でインスタンスハンドルを取得すればＯＫ
サンプルコード
limits はC++標準？
標準のはずだけど、昔はなかったかも
メンバテンプレート関数を VC でコンパイルしたい
VC6 だとコンパイルは無理
他のコンパイラなら大丈夫
VC のエディタのみ起動したい
無理っぽい
IDE そのものを起動して、ダミーのプロジェクトを読み込むとか

2000/09/07 (Thu)
お便り
インテリセンスが効くときと効かないときって？
条件は不明
ヘッダーファイルとは限らないっぽい
テンプレートだと機能しない

2000/09/08 (Fri)
お便り
アプリの起動を監視するためのフックがうまくいかない
CallWndProc() だとメッセージの書き換えができない
GetMsgProc() じゃ拾えないのかも
CBTProc() が最適だと思う
理論上はフック掛けなくてもできるかも

2000/09/09 (Sat)
お休み


/*             プログラミング辞書・今週の追加単語                 */
http://www.kab-studio.com/Programing/Dictionary/

・追加単語：
APIENTRY CSV EUC OCR operator TAPI 演算子のオーバーロード 
型変換演算子 ストリーム テーブル ドロップ 非同期 ファイル入出力 
マージ マウスカーソル メタファイル ランダム リストビュー 

・今週のごめんなさい
ハンドラ オープンしたファイルの名前 帳票 エディットボックス
Append mode のinput のしかたを載せてください。 マージソート
CreateThread バイナリー表示 タブコントロール rand srand
マルチスレッド ListView 上への変換 ｆａｒポインタ FlipToGUISurface
COM カーソル ODBC EUC 変換 CFile msb エントリポイント cin
タイムスタンプ DLL WaitForSingleObject サブスクライバ DOM
CGI ActiveX ラージモデル ラージモデル INADDR_ANY SHGetFileInfo
インスタンス化　失敗 MTS DIB スタティックライブラリ 
GetFileVersionInfo スレッド ビープ j MsChart wait クラス フック
コンソール LinkExecute タスクトレイ WM CreateFileMapping 
Stream スタックオーバーフロー stratr tchar カレット フック
Getdocument ServerVariables Creat LoadIcon

・今週の状況：
　と、今回はさらにごめんなさいが多いので、たぶんごめんなさいコーナー
は９月いっぱいでなくなると思います。あとアナウンスどおり、来週の
１１日〜１７日は単語送信受付を休止します。御了承ください。


{magclick}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
「来週、ぷらとわに iostream が登場！」
『とうとうここまで追い付いたのね！！』
「さらに１０月から再放送！」
『基礎から学びたいあたしにもばっちりねっ！！』
http://www.kab-studio.com/Programing/STLiostream/
_______________________________________________________________[KCM]
{magclick}


/*                       #pragma twice                            */
http://www.kab-studio.com/Programing/PragmaTwice/

　Version 5.08
LPCTSTR

「というわけで、数字を文字列に変えるには？」
『 sprintf() ！　だよね』
「そういうこと。それじゃ、久々に FileTest プロジェクトに戻って」

void CFileTestDlg::OnBtnShow() 
{
    m_cDataLstBox.AddString( "あたし" );
    m_cDataLstBox.AddString( "水希ちゃん" );
    m_cDataLstBox.AddString( "そんな感じ" );
}

『あ、ボタン押したらリストボックスに追加するっていうのだよね』
「 Ver 5.02 ( No.067 ) の続きってことで。今回の計画では、ファイルに
いっぱい入ってる整数値をリストボックスに追加する、っていうことにしま
す」
『そー決められました』
「そのためのテストってことで、３つの整数値をリストボックスに追加する
ように、このメンバ関数を書き換えてみて」
『おお、ちゃんとしたプログラムっぽい！　えっと……』
「こういうときは、まずひとつだけ追加、って形にして」
『あとで増やすんだね。プログラムは少しずつの積み重ね』
「そゆこと」
『じゃ、まず int 変数用意。あ、読み取り専用だから const にしとこ』

    const int iSource = 100;

『これを文字列に変換すれば、 AddString() に渡せるんだよね。……とり
あえず渡すところだけ書いてみようかな。 char 配列用意してっと』

    char chDist[256]; 

『そいや、この前とかも chDist だったけど、 Dist ってどーゆー意味？』
「……あ！」
『な、なに？』
「ごめん、間違った」
『ええ〜！！』
「 chDest だ。 Dest は destination の略で〈目的地〉とかって意味」
『う〜、しっかりしてよ〜』
「まーこういうこともあるよ」
『……で、 chDest にして、これを AddString() に渡すんだから』

    m_cDataLstBox.AddString( chDest );

『あとは iSource から chDest に変換すればいいんだから、 sprintf()
使って……』

    sprintf( 

『っと、使い方分かんないや』
「そういうときは MSDN 」
『だね。って、 sprintf() のページ見ても分かんないんだけど……』
「〈引数〉のところ見れば」
『あ、第１引数の char ポインタに書き込まれるんだね』
「分かってると思うけど、ポインタは」
『配列に [] 付けないの渡せばいいんだよね。ところでこの sprintf() の
ページに書いてある buffer ってなに？』
「バッファっていうのは〈緩衝材〉って意味で、とりあえずデータを置く場
所。でもここじゃ〈文字列を置く場所〉って意味で使われてるかな」
『とりあえずの置き場か。じゃ、さっきの chDest も chBuffer の方が良か
ったかな』
「その辺は場合場合だね。実際、 AddString() が最終的な出力先だから、 
chBuffer の方がいいかもね。あとは chTemp とか」
『 Temp って人材派遣会社の』
「あ、それ当たり」
『ええ〜なんでツッコミ入れてくんないの？』
「だから当たりだって。 Temp は temporary の略で〈臨時の〉って意味」
『あ、だから人材派遣なわけね』
「変数としては、一時的なデータの置き場、って感じかな。でもこういうの
使い始めると大変だからほどほどにね」
『だよね、何度もデータ変換したりしなきゃいけなかったら Temp だらけに
なりそうだもんね。でっと、 sprintf() の最初の引数が出力先だから』

    sprintf( chDest, 

『あとは TRACE() と同じっと。全部まとめると』

void CFileTestDlg::OnBtnShow() 
{
    const int i = 100;
    char chDest[256]; 
    sprintf( chDest, "%d", i );
    m_cDataLstBox.AddString( chDest );
}

『ビルドして実行、【表示】ボタンを押すと……やたっ、 100 って出た！』
「そんな感じだね。さて、ちょっと脇道にそれて、 AddString() って何だ
っけ」
『メンバ関数だよね。えっと m_cDataLstBox は…… CListBox の変数なん
だよね』
「これも Ver 5.02 ( No.067 ) を参照にしてねってことで」
『だから CListBox の AddString() なんだよね。 MSDN 見てもそう書いて
あるよ』
「その MSDN のページ、 AddString() の引数は？」

int AddString( LPCTSTR lpszItem );

『…… LPCTSTR ？？　"" で囲んだの……文字列リテラルだっけ、それ渡せ
てたからてっきり char * だと思ってたのに……』
「前は〈 LPCTSTR って書いてあったら文字列を渡せる〉ってことにしてた
けど、ここでひとつ、しっかり見ておきましょう」
『うお”、なんか大変そうな予感！』
「さてまず、〈組込型〉っていうものから」
『くみこみがた？』
「基本型とかプリミティブ型とかとも言うんだけど、 C++ 言語に初めっか
ら入ってる型のこと」
『ってことは、 char とか int とかってこと？』
「そういうこと。 MSDN で〈基本型〉のページ見てみて」
『あ、これって前に見たことあるような気が』
「 Ver 4.08 ( No.058 ) で見たね。ここに載っているのが組込型」
『 LPCTSTR 載ってないね』
「で、ここに載っていない型は、どっかで必ず定義されてます」
『どゆこと？』
「たとえば CListBox はクラスだから、どっかで定義されてるはずってこと」
『クラスなんかがそうなるんだね。ってことは、 LPCTSTR もどっかで定義
されてるの？』
「そういうこと。 MFC の入ってるフォルダの Afxwin.h の中で」

class CListBox : public CWnd
{    // 以下略

「って感じに作られてるわけ」
『 MFC のフォルダ？』
「 MFC そのもののプログラムが入ってるフォルダね。詳しくは Ver 3.8 
( No.033 ) を読み返して思い出してみて」
『そうそう、 CWnd とか全部そうやって入ってるんだった。もう１年も前だ
から忘れてたけど』
「同じように、 LPCTSTR も作られてるわけ」
『ってことはクラス？』
「あ、そういうわけじゃないんだけどね。それに、 MFC のものでもないし」
『じゃーなんなの？　ランタイム？　あ、でも sprintf() は char * だっ
たもんね』
「あともうひとつあったでしょ、 API っていうのが」
『なんだっけそれ』
「……」
『あー、 API っていうのがウィンドウズの操作をするためので、 MFC はそ
れを呼んでるだけなんだよね、って Ver 3.9 ( No.034 ) とかに書いてある』
「 LPCTSTR は API で定義されているもの。この定義されてる部分も、プロ
グラムとしてちゃんと書かれてるから」
『それを探すんだよね』
「そう、実際には全文検索で探すんだけど、これはかなり大変だから、今回
は直接見てみることにするね」
『難しいの？』
「そう、探し方にコツがいるし、どれが求めてる情報なのか見極めるための
知識も必要」
『そーゆーもんなんだ』
「というわけで、 LPCTSTR は Wtypes.h で次のように定義されてます」

typedef /* [string] */ const TCHAR __RPC_FAR *LPCTSTR;

『あ、 typedef って初見』
「 typedef は sizeof と同じ C++ の機能のひとつで、型の〈別名〉を付け
るためのもの」
『別名？』
「たとえば」

typedef int Int;

「ってなってたら、 Int を int と同じように使えるってこと」
『あ、そういう別名なんだ』
「あと」
 
typedef int *PInt;

「なら、 PInt は int * 型として使えるようになるから」
『よーするに、一番最後の単語が〈新しい型〉なんだよね』
「そうそう。ってことは？」
『ってことは、 LPCTSTR 型は、 const TCHAR __RPC_FAR * 型ってことにな
るけど……なんかチンプンカンプン』
「でも分かんないのふたつだけでしょ」
『うん、 TCHAR と __RPC_FAR ってゆーの』
「 TCHAR も __RPC_FAR も、同じように〈他のの別名〉。全部大文字の単語
はたいがいそうだね」
『ってことは、 TRACE() も？』
「あ、そういえばそうだね。で、 TCHAR は char の別名。 __RPC_FAR は空
白」
『空白？』
「そ。えっと、 Rpc.h っていうファイルに次のような行があるでしょ」

#    define __RPC_FAR

『あ、 define って前に見たね』
「 #define は〈単語の置き換え〉をするためのもの。 Ver 4.09 ( No.059 ) 
でやったよね」
『そうそう、定数値作るときに使った。でもこれって、何に置き換えてる
の？』
「これは空白に置き換えてるもの」
『あ、右側の単語が左側のに置き換わるんだもんね、だから空白になるんだ。
……？　置き換わるって、なんか typedef みたいだね』
「そう、昔は typedef の代わりによく使われてたかな。ま、その辺は置い
といて、結局 LPCTSTR は？」
『 TCHAR を char にして、 __RPC_FAR を空白にすると』

typedef const char *LPCTSTR;

『あ、なんだ、ただの const char ポインタじゃない！　だから文字列リテ
ラルとか渡せたんだ』
「同じく、 LPTSTR っていうのは」

typedef /* [string] */ TCHAR __RPC_FAR *LPTSTR;

『これはただの char ポインタだね』
「つまり LPCTSTR も LPTSTR も」
『ただの char ポインタ、文字列用に使うってことなんだね。あと const 
のあるなしで、 LPCTSTR が渡す専用、 LPTSTR が受け取りようなんだ』
「 API とか MFC でこのふたつはよく出てくるから。重要なのは、こうやっ
て調べればちゃんと分かるってこと」
『私はわかんないけど……』
「もちろん今はね。でも勉強すればちゃんと分かる！」
『ようするに、 LPCTSTR みたいな謎なのも、なんとかできればちゃんと分
かるってことね』
「そういうこと」

/*
    Preview Next Story!
*/
『でも難しい〜』
「ま、細かいことよりも〈調べれば分かる！〉ってことが大事」
『それはそうよね、〈何も分かんない〉じゃ政治は変わらないよね』
「うお、なんかすごいこと言ってる……」
『というわけで次回』
＜ Version 5.09 ファイルから読み取る！ ＞
「につづく！」
『あ、もしかしたら iostream とか使う？』
「使います」
『おお！！』


/*                       金菜さんの憂鬱                           */
http://www.kab-studio.com/Programing/KanaU/

const メンバ関数
#05 const メンバ関数を使う機会

　#01 で言ったように、 const は、 const 型として使うよりも const 参
照や const ポインタとして使うことの方が多いんです。特にクラスは。

void UseRef( const CForConst &p_rcForConst );

　という感じに、クラスを const 参照渡しすることが多いと思います。ま
ず、クラスは値渡しが大変という面があります。コンストラクタとデストラ
クタが余計に呼ばれるし、メンバ変数を全部コピーしなきゃいけないし、コ
ピーコンストラクタの実装方法によってはさらに面倒なことになるから。だ
から、必然的に参照渡しが基本になります。
　さらに、同じく #01 で言ったように、変数が書き換えられる範囲はでき
るだけ狭くしたいと思った場合、必然的に const を採用することになりま
す。この関数内で引数を書き換えないと判断したら、 const にすればいい
わけ。
　でもここで問題が。そう、 const にしたら、 const メンバ関数しか呼べ
ないでしょ。ってことは、この関数の中じゃ const メンバ関数しか呼べな
いことになります。 CForConst が const メンバ関数を持ってなかったら、
p_rcForConst はメンバ関数ひとつ呼ぶことができないってことになります。 

　MFC や標準 C++ ライブラリのような「最新のクラスライブラリ」は、
const メンバ関数がちゃんと装備されています。だから、これらのライブラ
リを使う場合には積極的に const 参照を使うことができます。
　やっぱり問題は、自分が作ったクラス。自分が作るクラスに const メン
バ関数を装備させるのは、結構大変なこと。その手間を考えると、 const
参照を使いづらくなっちゃうんじゃないかな。
　でも、 const 参照のメリット、変数が書き換えられる範囲を狭めるって
いうメリットは、何にも代え難いもの。それに、 const メンバ関数自体も、
同じようにメンバ変数を書き換える範囲を狭めてくれます。結果、プログラ
ムの可読性・安全性・メンテナンス性が格段に向上します。
　というわけで、 const 参照と const メンバ関数のメリットがある以上、
使うべき。次回からは、実際に使う上での壁をクリアする方法について見て
いくことにします。じゃね。


/*            ２０００年９月１８日（月）の更新予定                */
http://www.kab-studio.com/

・更新予定未定（汗）
　何か更新したいんだけど、時間的に不可能っぽい（汗）。するとしたら、
新しい表紙か、新しい小説関係か、 STL & iostream 入門関係か……。


/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.com/nikki2/
・プログラミングに関する質問は[鏑矢の憂鬱]にお送りください。
http://www.kab-studio.com/Programing/KabuU/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://bigbeat.tegami.com/~mgsearch/frame.cgi?id=0000012198
http://www.kab-studio.com/Freeware/

/*
    KAB-studio.h
    Weekly Mail Magazine.
    Written by Kaburaya Seiden.

    (C)KAB-studio 1999 - 2000 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com
*/


/*                      See you next week!!                      */


