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

    KAB-studio.h


    (C)KAB-studio 1999 - 2004 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz

    送信日： 2004/08/16(Mon) No.270
    配信数： 2094
    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
*/
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
/*                ２００４年８月１６日（月）の更新                */
http://www.kab-studio.biz/index.html

・ほとはー９の１追加！
　三人合体ホットハーブに「９の１ 横暴委員長」を追加！
　お待たせしました、久々の更新＆新章突入です！
[ 三人合体ホットハーブ ]
http://www.kab-studio.biz/Comic/HotHerb/index.html


////////////////////////////////////////////////////////////////////
/*                        ちょお普通な日記                        */
http://www.kab-studio.biz/nikki2/index.html

2004/08/08 (Sun)
　今月の表紙壁紙は７５６０円。描き方解説。そしてＮスペ・トラックの運
ちゃん。

2004/08/09 (Mon)
　計算系のバグと平行して他のバグや仕様変更を潰す。なんかよく分かんな
いプレッシャー。なんか疲れた……昨日のが影響？　ハガレンいいなぁ。

2004/08/10 (Tue)
　夕方くらいからいきなり忙しく。 SQL を Java で叩くとエラーになる。
かぶろぐ２万ヒット達成。密かにかぶスタで一番人気のホームページに。
はてなのすごさ？

2004/08/11 (Wed)
　今日もバグ潰し。連休は取れることに。とりあえず１ヶ月休んじゃおうか
なぁ……。リクナビと就職活動の想い出。

2004/08/12 (Thu)
　ソートのコードがスパゲッティになりまくりで作り直し。休みづらい環境
だ……。ギャラクシーエンジェルＢパートが素晴らしすぎる。かぶろぐの
ヒット数について。

2004/08/13 (Fri)
　電車の中から。エラーまわりのを直して、それからプチ打ち上げへ。名刺
ばらまく。その後徹ゲーへ。今回はなんか色々と。そして帰る途中。

2004/08/14 (Sat)
　１０時半に起きて洗濯とかして昼寝して。ほとはーは描かず、代わりにビ
デオのダビングやファイルの整理やバックアップを。谷亮子すごい……。ア
マゾンから来たパースの本がいい感じ。でもちょっとはしょりすぎ？


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

■　第十章　剣と魔法　−１９−

「で……それだけ色々なことを知ってるんだから、左さんが泉のことを知っ
ていてもおかしくない、ってこと？」
「そう。問題は……」
　ふぅ、とため息をつく。
「知っていても、教えてくれない、ってこと」
「……なんかむかつくな、それ」
「掌で弄ばれているっていうか」
「そんなこと前からわかってる。私達は……この先ずっと、洋一の掌の上に
いることになる」
「リシュネ……」
　別にそんなかわいそうなものを見るような目で見ないで。私は別に気にし
てないから。それに……。
「掌の上にいることを自覚している方が、そこから飛び出しやすいと思うけ
ど？」
　にこっ、とリシュネは笑んでみせた。
「……」
　つられて、舞も笑みを見せた。
「ただ、洋一も頑固な方じゃないから、もう少し粘るつもり」
「教えてもらえるかもしれない、ってこと？」
　頷いて、
「だから……舞もうちに来て、説得してみない？」
「ん……半月待って」
　舞はほぼ即答した。
「９月？」
「私、ここでもう少しがんばって、龍脈のこともう少し解るようになりたい
から。その方があとで探すときにも楽だろうし」
　この半月がんばってきたんだから、もう少しがんばりたい。赤葉様から教
われるだけの分は教わっておきたかった。
「……その前に、一度碧き泉に戻った方がよいな」
「え？」
　赤葉は少々あきれていた。
「９月……学校はどうする気だ？」
「あ」
　本当に忘れていた、そんな感じの声を出した。
                                                              (続く)

////////////////////////////////////////////////////////////////////
/*                       #pragma twice                            */
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

　Version 14.03
ファイルの排他処理

「今回は、ファイルにロックを掛けて他のアプリが開けないようにする方法
について説明します」
『それをすれば……はいた、だっけ』
「そう、排他処理をすることができるので、あるプロセスが開いている間は
他のファイルが開けないようにすることができます」
『はー、便利ねー』
「さて、ファイルロックの方法について説明します。まず、ファイルロック
は〈ファイルを開くとき〉に行います」
『ファイルを開く？』
「そう。ファイルを開くときにロックを掛けると、そのファイルを閉じるま
ではロックがかかったままになります」
『なるほど、開くときにロックを掛けて、閉じるときにロックを解除する、
と。ん？　でもさ、 fopen() にそんな機能あったっけ？』
「ないよ。 fopen() はランタイムだから、どんな OS でも使えるように
なっているけど、ファイルロックの機能は OS 個別の機能だからね」
『そういう機能はランタイムに入れられない、と。あ、もしかして API 使
うの？』
「そういうこと。 Version 5.15 ( No.080 ) の CreateFile() を使いま
す」
『確か、ランタイムも結局これ使ってるんだよね』
「 OS 個別の機能を隠して、汎用的に使えるようにしたのがランタイムだか
らね」
『でも、この API 結構使うの面倒だったような……』
「大丈夫、今回はファイルロックの部分しか見ないから」
『んー』
「じゃ、実際の例を見てみます」

HANDLE g_hFileFrom = NULL;

void OpenFile( CString p_cStr )
{
    // ファイルを開きます。
    g_hFileFrom = CreateFile
        ( p_cStr
        , GENERIC_READ
        , 0                // Ａ
        , 0
        , OPEN_EXISTING
        , 0
        , 0 
        );

    // 確認用。 FFFFFFFF だと開くのに失敗しています。
    TRACE( "%X\n", g_hFileFrom );
}

「エラーチェックとかすごく省いているから注意して」
『ってゆーか、 CloseHandle() しなくていーの？』
「本当はした方がいいけど、テストだから今回は省略」
『んー、使い方って、引数の p_cStr にファイルパス渡せばいいの？』
「そう。フルパスを渡すのが手っ取り早いかな。 Version 5.30 ( No.095 ) 
を参考にしてファイルダイアログを使うっていうのもありかも」
『それこそテストだったら必要なさそう……』
「ちなみに」

void Use_OpenFile()
{
    OpenFile( "Test.txt" );
}

「っていうふうにファイル名だけでも通ります。ただし、デバッグ実行する
ときにはワークスペースのフォルダ、つまり .dsw ファイルが置いてある
フォルダに置くようにしてください」
『 exe の置いてあるところっぽいのにね』
「デバッグ実行の時は、カレントディレクトリが変わるからね……それと、
このファイルは当然前もって作っておいてください」
『普通のテキストファイルでいいの？』
「それでＯＫ。この関数の呼び出し方だけど、ダイアログアプリで、ボタン
を押したら呼ぶ、っていうのが簡単かも」
『いつものテストアプリみたいな感じね』
「念のため書いておくと Version 4.01 ( No.051 ) で紹介した方法です」
『これでＯＫ？』
「それでＯＫ」
『んじゃそれを指定してプログラム実行！　……で？』
「そのテキストファイルをメモ帳で開いてみて」
『ほい……あ！』

プロセスはファイルにアクセスできません。別のプロセスが使用中です。

『あらー、なんか簡単にロック掛かっちゃった』
「そう、実は CreateFile() で開くと、デフォルトでロックがかかるんで
す」
『ちょっと意外。デフォルトは開ける、って状態だと思ったのに』
「この辺は安全でいいかも。それと、この状態は〈本当に何もできない〉
ってことだから」
『どゆこと？』
「つまり、見るだけでもできないし、ファイルのコピーもできません」
『コピーもできないの？　……うわ、こんなダイアログ出た』

Test をコピーできません。共有違反がありました。
送り側または受け側のファイルは使用中の可能性があります。

『複製すら作れないんだ……』
「前回の例で言えば」

キャンセル
1. Excel Ａが開いている間は Excel Ｂは開けないようにする

「に当たるかな」
『どうしようもできなくしちゃうわけねー』
「この状態なら完全な排他制御。これならアプリＡが使っているときに
アプリＢが読み込んで待ちがった処理をする、ってことがないでしょ」
『確かに……本当の排他制御、ってわけね』
「さて、今の状態は読み書き両方できない状態です。これを、読み込むのは
できるようにします」
『リードオンリーってことね』
「具体的には、 CreateFile() の第３引数にフラグをセットすればＯＫ」

    // ファイルを開きます。
    g_hFileFrom = CreateFile
        ( p_cStr
        , GENERIC_READ
        , FILE_SHARE_READ    // ここを変更。
        , 0
        , OPEN_EXISTING
        , 0
        , 0 
        );

『 FILE_SHARE_READ ってのを渡せばいいのね』
「これで実行して、ファイルをメモ帳で開いてみて」
『お、今度は開けた！』
「それを上書き保存してみて」
『ほい……あ』

ファイル Test.txt を作成できません。
パスおよびファイル名が正しいか確認してください。

「アプリによっては最初に開くときに【上書き禁止】って出るものもありま
す」
『なるほど、さっきと違って読み込みはできるけど、書き込みはできないっ
てわけね』
「前回の例で言うなら」

読み取り専用
2. Excel Ａが開いている間は Excel Ｂは書き込めないようにする

「に当たるかな」
『読み取り専用ねー』
「排他制御とか考えない場合には、これが一番普通かも。フラグなしの状態
だと複製コピーすらできないから問題だし」
『問題？』
「バックアップコピーとかできなくなるから」
『うわぁ……』
「読み取り専用で、あとは〈最新の状態を取得する〉っていう機能を入れれ
ば同期処理としては十分だから、この読み取り専用が一番いいかも」
『その〈最新の情報を取得〉とかが難しそうだけど……』
「最後は、全部許可」

    // ファイルを開きます。
    g_hFileFrom = CreateFile
        ( p_cStr
        , GENERIC_READ
        , FILE_SHARE_READ | FILE_SHARE_WRITE    // ここを変更。
        , 0
        , OPEN_EXISTING
        , 0
        , 0 
        );

『実行！　うわー、保存もできちゃう』
「 FILE_SHARE_READ と FILE_SHARE_WRITE 、両方のフラグを立てるとなん
でもできるようになります」
『こりゃまずいね……』
「でも fopen() はこれだから」
『へ？』
「 fopen() で開いたファイルは、他のアプリから読み書きし放題、ってこ
と」
『それまずそう……ってことは foepn() って使えないじゃん！！』
「そうなんだよね、ある程度ちゃんとしたアプリを作る場合には fopen() 
は使わない方がいいかも」
『かといって API 使ってファイル操作って面倒よね……』
「さて、ここまでファイルの排他処理について説明してきましたが、実はこ
れはある意味〈雑〉なやり方です」
『え、そうなの？』
「こういう形でファイルのロックを掛けた場合、ファイルが使えるように
なっても教えてくれないから」
『見張る必要がある？』
「そういうこと。ファイルの排他処理のメリットとデメリットをあげると」

■メリット
・お手軽
・他のアプリからファイルを守る

■デメリット
・同じアプリでもプロセスが違うとアクセスできない
・通知が面倒

『細かい処理には向かないってことね』
「というわけで次回へ続く！」

/*
    Preview Next Story!
*/
『ファイルロックって、確かにおおざっぱな感じよね』
「というわけで次回は同期オブジェクト」
『……なーんか〈同期〉って言葉、慣れないかも』
「というわけで次回」
＜ Version 14.04 同期オブジェクト ＞
『につづく！』
「上に〈シンクロ〉ってふりがな振ってあると思えばいいかな」
『シンクロって、水泳のがインパクト強いし……』


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

・ほとはーに１話追加
　三人合体ホットハーブに一話追加します。

・KAB-studio.h 縮刷版更新
　KAB-studio.h が２７０号に達したので縮刷版を更新します。


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

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


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

    (C)KAB-studio 1999 - 2004 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz
*/
////////////////////////////////////////////////////////////////////

