////////////////////////////////////////////////////////////////////
/*

    KAB-studio.h


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

    送信日： 2002/02/25(Mon) No.146
    配信数： 3760 ( Mag2 + Pubzine )
＊    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine ( URL: http://www.pubzine.com/  ID: 590 )
*/
////////////////////////////////////////////////////////////////////

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

・Java メルマガ更新
　Java で納得オブジェクト指向プログラミングのページを更新しました。
　まぐプレのシステムが変わって、バックナンバーを簡単に購入できるよう
になりました！　これで特定の月の号だけ簡単に読むことができます。これ
でもう気になるあの号だけさくっと読めます！
[ Java で納得オブジェクト指向プログラミング]
http://www.kab-studio.com/Programing/JavaOOP/


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

2002/02/17 (Sun)
　３月表紙壁紙！　やっぱりエアブラシ塗りだと早いねぇ。表情とか結構い
い感じに描けたかな？　昼寝して悪夢。そして激痩せした人。っつーか牛
丼？

2002/02/18 (Mon)
　がーっとコーディング、次のお仕事のお話、ミスがヤバいかもしんない。
そして牛丼は実は豚肉だった！？　区別が付くか〜。

2002/02/19 (Tue)
　昨日の問題はお願いして解決。夕方に客先へ。作業して会社戻って突貫工
事して帰宅。疲れる〜。

2002/02/20 (Wed)
　バグ？　最適化したら落ちたり、 NT4 では動くけど Win95 では落ちたり
とか。午後は客先。どんな仕事も大変ね〜。リブレットはやっぱり便利。八
面六臂の活躍です。

2002/02/21 (Thu)
　プログラミングしつつ、障害発生で客先へ。ミスと原因不明。むぅ。

2002/02/22 (Fri)
　午前中は客先作業。昨日の問題はあらかた解決(爆)。でも原因はほとんど
わて。っつーか、設計もコーディングも管理もしてたら気が回らない(泣)。
へそ卑怯。あのコスチュームは普段着ですか？　ペケ箱はどうでしょう
ねー、ネットゲーへの移行はうまくいくんでしょーか。

2002/02/23 (Sat)
　花粉症が辛い〜。紫蘇系で防ぐしか。豚汁作ってお仕事へ。結構はかどっ
たり戸惑ったり。あずまんが大王 DVD とフィギュアスケート。見損ね兼ね
ないですかー？


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
http://www.kab-studio.com/Novel/Fuga/

■　第三章　きもち　−９−

　空が少し夕暮れへと移りつつあるその下で。
　人混みの中、俊雄と舞は目的もなく歩いていた。と言っても、舞の表情は
明るかった。
　見た映画は「ハリウッド製超豪華ＳＦＸアクション」で、俊雄はその考え
ナシの内容に少し閉口していたが、それに反して舞はかなり面白かった様子
で、それはそれで俊雄にはうれしかった。
「舞さん、ああいうの好きなんだ」
「ん、そうかもね。なんかさ、ああいうの見てると血ぃ沸き肉踊るって言う
かぁ……あ、あの人」
「ん？」
　舞はいきなり人混みをかき分けて進んでいく。俊雄は誰のことを言ったの
か判らないままただただ腕を引っ張られるままに歩く。
　ようやく舞の隣までたどり着いたとき、目の前にいた男に気づいて、その
瞬間、嫌悪感がまず表れた。その男は、公園で雅樹とともに会いにいった男
だった。粗雑な服装の中年男だが、俊雄はその目を見て、危険信号を感じて
いた。だから、舞を連れてその場から立ち去ろうとしたが。
「教えて欲しいことが、あるんです」
　その前に、舞は男へと話しかけていた。
「行きましょう舞さん」
　俊雄は舞の手を掴んで、半ば強引にその場を立ち去ろうとしたが、舞はそ
のスキンシップさえも気づかなかった。
「あれから何か判ったことがないかとか、それと……」
　うつむいて、一瞬黙って、そして、顔を上げた。男の目を見て、言った。
「雅樹のこと、教えて欲しいんです」
　舞さん……俊雄は斜め後ろから見える舞の真剣な眼差しを、悲しそうな目
つきで見ていた。
「……あんた、朴の女か？」
「え？　いえそういうわけじゃ」
「だったら、あいつには関わるんじゃない」
　男の口調は、強く、真実味に溢れていた。真剣な警告だった。
　舞がうつむいたのを見て、男は言葉を継いだ。
「あいつは、正真正銘の悪魔だ。今は、結構いいやつそうに見えるけどな」
「今は……？」
「朴の逆鱗に触れて消された男は数知れない、そういうことだ」
　舞の瞳孔が開いた。
「それって、朴さんが――その、殺したってことですか？」
　木村は、その言葉の現実味を実感できなかった。少し危なっかしいお兄さ
ん、くらいにしか見えなかった。
　舞は、違った。
「その話、詳しく教えてください」
「おいおまえ、俺の話を」
「教えてください！！」
　舞は頭を下げて、そう言った。喧噪の中、俊雄は沈黙したまま、舞の背中
を見続けていた。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『やっと、 Java メルマガのバックナンバー買いやすくなったね』
「これは実は大きいんだよね」
『そなの？』
「だって、普通本買う時って」
『購読登録とか必要ないもんね』
「より普通の本に近くなったってことかも」
『……そうかなー』
「え？」
『本だったら、何ページだけ欲しいとかできないじゃん』
「そっか、これだと月単位で買えるから」
『むしろ本よりもすごいんでない？』
「ただ……」
『ただ？』
「数ページで４００円ってちょっと高いかも」
『う”、言えてる』
http://www.kab-studio.com/Programing/JavaOOP/
_______________________________________________________________[KCM]


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


　Version 8.04
プロセスとインスタンスハンドル

「前回は」
『っつーか、ここ最近インスタンスハンドルばっかり』
「インスタンスハンドルというよりは、メモリ関係の話ってところかな。こ
の辺は C++ 言語では切っても切れない話だから」
『うー』
「さて、まずは前回見たようなプログラムから」

#include <Windows.h>
#include <stdio.h>

int WINAPI WinMain
    ( HINSTANCE p_hInstance
    , HINSTANCE p_hPrevInstance
    , LPSTR p_pchCmdLine
    , int p_iCmdShow
    )
{
    // インスタンスハンドル（ p_hPrevInstance ）
    // を文字列化します。
    char pchMsg[1024];
    sprintf( pchMsg, "HINSTANCE(PREV) : %x", p_hPrevInstance );
    // それを表示。
    MessageBox( NULL, pchMsg, "WinMain()", MB_OK );
    return 0;
}

『ホント、似てるね。んーっと、 p_hInstance が p_hPrevInstance になっ
てるだけだ』
「そう、今回は p_hPrevInstance 、つまり WinMain() の第２引数に何が渡
されてるかを見ていきます」
『そういえば第１引数も第２引数もインスタンスハンドルだよね。ちょっと
謎』
「ではその謎な値を見てみましょう」
『ビルドして実行！　……あれ？　 0 だって』
「そう、ゼロ。 WinMain() のリファレンスにも書いてあるけど、この第２
引数には必ず 0 が渡されるんです」
『リファレンスには〈 NULL が渡される〉って書いてあるけど』
「同じことだよ。 Version 5.11 ( No.076 ) 参照」
『あー、そっか。ハンドルもポインタだしね』
「そうそう。で、これがなぜゼロなのか」
『そうよ、必ず 0 なら、こんな引数要らないじゃない』
「そう、今はね」
『今は？　これから必要になるの？』
「これからじゃなくて、昔必要だったんです。実は、昔はインスタンスハン
ドルは一定じゃなかったから」
『へ？　だって、 0x00400000 で全部同じだったじゃない。昔はそうじゃな
かったの？』
「正確に言えば、 Windows 3.1 以前の OS はそうだったんです。この前、
メモリとかアドレスとかは仮想のものだって言ったよね」
『うん、ハードウェアのメモリのアドレスじゃなくて、それとは違うアドレ
スなんだよね』
「そうそう。で、その仮想アドレス、実は Windows 3.1 とか MS-DOS の時
代にはなかったんです」
『なかった？』
「その頃は、ハードウェアのメモリに直に実行ファイルや変数が置かれてた
んです」
『ってことは、アドレスもハードウェアのメモリ上のそのもの？』
「そのもの。で、実はそれはまずいんです」
『まずい？』
「今の仮想メモリの場合……そうだね、前回みたいに何回も起動したとしま
す」
『ダブルクリックしまくってね』
「その中で、一番最初に実行したのから、２番目に実行したのの変数を見た
り書き換えたりするのってどうすればいいと思う？」
『どうすれば……って、それ無理なんじゃない！？』
「そう、無理なんです。実行したものそれぞれに仮想メモリが存在するわけ
だから」
『他の仮想メモリを見たくても、結局自分の仮想メモリを見ちゃうわけね』
「これはとても安全なんです。他から邪魔されないから」
『なるほど、ハードウェアのメモリに全部置かれてると、他のアプリの邪魔
が出来ちゃうんだ』
「わざとするのももちろん、プログラムミスで」
『げ！』
「ま、逆にだから速い処理もできたりするんだけどね」
『速い処理？』
「……まぁそれは置いといて、歴史的には」

MS-DOS や Windows 3.1 : ハードウェアのメモリのアドレス : 危険
Windows95 以降 : 仮想メモリ、仮想アドレス : 安全

「っていう経緯があるわけです」
『安全な方に移ったわけね』
「で、昔の危険な頃は、ハードウェアのメモリ上にアプリが散在してまし
た。なので、その場所を知る必要があったんです。それがインスタンスハ
ンドル」
『おお！』
「この頃は、インスタンスハンドルはまさにアプリのハンドル。ひとつ実行
すると、ひとつメモリに置かれて、その先頭のアドレスがインスタンスハン
ドルとして渡される」
『実行されるごとの、まさに背番号ね』
「と、この〈実行される単位〉を【プロセス】って言います」
『プロセス？』
「 proccess は〈進行〉とか〈過程〉とか言うんだけど」
『結果じゃなくプロセスが大事、とか言うもんね』
「まぁあんまりニュアンスが分かりづらいから〈処理単位〉くらいに訳した
方がいいかも」
『テキトーねー』
「ま、それはともかく。アプリを実行する度に、仮想メモリがひとつ作られ
て、その中に実行ファイルとか変数が置かれます。このかたまりがプロセス
になります」
『実行する度に作られるものなのね』
「そうそう。 VC に付いてくる Process Viewer を使うと今作られてるプロ
セス全部を見ることが出来るから、一度見ておいて」
『はーい。で、話を戻して、もうひとつの p_hPrevInstance はなんなの？』
「これは previous なインスタンスハンドル。 previous は〈前〉って意
味」
『プレビューとか言うもんね。でもひとつ前のインスタンスハンドルっ
て？』
「そのまま。実行ファイルを数回起動してその都度プロセスが作られた時
に、ひとつ前に作られたプロセスのインスタンスハンドルがそう」
『？？』
「あ、これは昔のイメージで考えないと分からないよ。たとえば」

昔のメモリ
[アドレス]
1000 : ひとつめのプロセスの置かれた場所（＝インスタンスハンドル）。
1001
...
3000 : ふたつめのプロセスが置かれた場所。
3001
...
5000 : みっつめのプロセスが置かれた場所。
5001

「って場合に、みっつめのプロセスでは p_hPrevInstance には 3000 が渡
されることになります」
『あ、そういう〈ひとつ前〉ね』
「そゆこと。で、これが今は 0 なのは分かるよね」
『もちろん。だって、仮想メモリだと全部同じなんだもの。ひとつまえのイ
ンスタンスハンドルは自分と同じだし、ハードウェアのはもらっても仕方な
いし』
「そういうこと。こういう経緯で、昔は必要だったんだけど、今は必要な
いっていうかどうしようもないから 0 が渡されるんです」
『なるほどねー。でも、必要って何に使うの？』
「たとえば、複数起動を防ぐ場合。アプリの中には〈ひとつだけしか実行さ
せたくない〉って場合あるでしょ」
『ユーティリティとかそういうの多いよね』
「昔は、それを実現するために p_hPrevInstance を使ってたんです。 
p_hPrevInstance には直前のプロセスのインスタンスハンドルが入ってるわ
けだけど、もし直前のがない、つまり最初に実行された時には 0 が入って
るんです」
『ってことは p_hPrevInstance に 0 が入ってたらそのまま実行、それ以外
のが入ってたら何もせずに終了』
「っていうことをしてたんです。たとえばこんな感じ」

#include <Windows.h>

int WINAPI WinMain
    ( HINSTANCE p_hInstance
    , HINSTANCE p_hPrevInstance
    , LPSTR p_pchCmdLine
    , int p_iCmdShow
    )
{
    // NULL じゃないということはすでに実行されているので
    // 何もしません。
    if( p_hPrevInstance != NULL )
    {
        return 0;
    }

    // あとは普通に。
    MessageBox( NULL, "テスト", "WinMain()", MB_OK );
    return 0;
}

『なるほどねー』
「重要なのは、このプログラム、機能はしないけど、エラーにもならないっ
てこと」
『そりゃそうよね、 p_hPrevInstance は 0 に決まってるんだから』
「わざとそうしてるってことも言えるかな。もしこれが -1 を返すように
なってたら」
『このプログラム、使えないね』
「つまり、 Windows3.1 のプログラムを Windows98 に使えるようにするの
に修正しなきゃいけない」
『げげ』
「これは WinMain() もそう。もし p_hPrevInstance が必要ないってことで 
WinMain() の引数が３個になったら」
『それも修正しなきゃいけない！　めんどくさー』
「今の時代は必要ないものが残ってるのは、そういう理由があるんです」
『でもそれなら〈いらない〉って一言でいいんじゃ』
「一言でいいの？」
『うーん……』

/*
    Preview Next Story!
*/
『インスタンスハンドル、なんかポインタ編みたいな感じ』
「実際、このバージョン８はそういう話多いかも」
『む、結構手強いかも』
「本当はねー、こういうの知らなくてもプログラム組めるんだけど」
『ってゆーかずっと知らなかったし』
「でも一歩上を目指すには必要だから」
『ホントにぃ？』
「というわけで次回」
＜ Version 8.05 コマンドラインと表示方法 ＞
『につづく！』
「頂点を目指すために！」
『ってゆーか目指す必要あるの？』


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

・３月表紙壁紙！
　毎月恒例、新しい表紙壁紙です。今回はもう描き上がってます（爆）。い
つもと絵柄違うから結構いいかも？


////////////////////////////////////////////////////////////////////
/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.com/nikki2/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://backno.mag2.com/reader/Back?id=0000012198
http://www.kab-studio.com/Freeware/index.html#MailMagazine


////////////////////////////////////////////////////////////////////
/*
    KAB-studio.h
      Weekly Mail Magazine.
      Written by Kaburaya Seiden.
      http://www.kab-studio.com/Info/MailMagazine/

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

