#pragma twice

KAB-studio > プログラミング > #pragma twice > 044 Version 3.19 レジストリに保存しよう!

#pragma twice 044 Version 3.19 レジストリに保存しよう!

前のページへ 表紙・目次へ 次のページへ

 Version 3.19
レジストリに保存しよう!

じゃ、今回の目的をいいます
はぁい
 Calc ダイアログを【OK】ボタンを押して閉じたときに〈足し算の結果〉
を保存して、次に開いたときに〈前回の結果〉が表示されるようにすること
つまり、データを保存して、また取り出すってことだよね
そういうこと。ダイアログへの表示はできるわけだからね
で、その保存するのに〈レジストリ〉てのを使うんだ。でもそのレジスト
リってなに?
それをまず見ておこうか。レジストリっていうのは、ウィンドウズのあり
とあらゆる設定を保存する巨大なファイルのこと
たとえば?
たとえば【画面のプロパティ】。このプロパティの各設定はレジストリに
書き込まれてるから
背景はこのファイルとか、スクリーンセーバーはこのファイル、とか?
そういうこと。んじゃまず、 Windows フォルダを開いてみて
はーい。えっと、 C:\Windows っと
このフォルダに System.dat と User.dat ってファイルがあるでしょ
うんあるよ。これがレジストリ?
そう、このファイルがレジストリの本体。このファイルはまめにバックア
ップを取っておくようにしてね
ってそれは水希ちゃんの仕事でしょ?
ま、僕はツールで自動的に保存されるようにしてるから大丈夫だけど。こ
れからレジストリの中を見るから、そのときうっかりデータを書き換えちゃ
うかもしれない
それってやばい?
データによってはね。レジストリにはデバイスドライバの設定とかも書い
てあるから。もし書き換えちゃって起動しなくなったら
レジストリをコピーすればいいわけねー
そういうこと。そのためにもまめなバックアップ。で、別にこのファイル
を直接見るわけじゃなくて、レジストリを見るための専用ツールが用意して
あります
どこに?
この Windows フォルダに。 Regedit.exe ってアプリがあるでしょ
ダブルクリック!
 【レジストリエディタ】というウィンドウが開く。エクスプローラー風、
左に【マイコンピュータ】などのツリー、右は空白。
れじすとりえでぃた?
そう。これを使うとレジストリの中を見たり、レジストリを書き換えたり
できます
うわ危険そう!
とりあえず左のツリー、開いてみ?
うん……なんか英語ばっかで不安〜
大丈夫だって、そう簡単に書き換えられることはないから
で、こんなかのどっかに【画面のプロパティ】の情報とかがあんの?
そういうこと。さて、今の壁紙は【森】だけど
はっ、いつの間に! いつもはでじこなのに
ウソ言っちゃいけませんぜダンナ
ダンナちゃうもん。んで?
この〈壁紙は【森】ですよ〉っていう設定が、レジストリに書き込まれて
るから、それを探します。まず【マイコンピュータ】をクリックして、メ
ニューの【編集】−【検索】を選んで
なんだ、VCと同じじゃん
ま、同じメーカーのものだしね。そしたら【検索対象】−【データ】だけ
をチェックして、【検索する値】を【森】にして
【次を検索】をオン!
 【レジストリを検索中】というダイアログが出る。
……
……
……結構時間かかるね
データ量が膨大だからね……あ、みつかった
 左のツリーは【HKEY_CURRENT_USER\Control Panel\DESKTOP】が、右のリ
ストは【Wallpaper】が選択状態となっている。
あ、コントロールパネルのデスクトップ、そのウォールペーパー、まさに
壁紙の設定ねー
って感じに、レジストリには設定を書き込むことができるわけ
へー。これって、なんかファイルっぽいよね
ファイルに近い構造にしているんだね。実際にはさっき見たふたつのファ
イルにこのツリー形式のデータが入ってるんだけど
この方が分かりやすいもんね、【コントロールパネル】のカテゴリ、みた
いに
ちなみにこのフォルダみたいのを【キー】っていいます
キーって鍵のこと?
そ、値を取り出すための鍵ってところかな
ふーん
で、【HKEY_CURRENT_USER】ってあるでしょ。これが重要。ここには〈現
在ログオンしてるユーザーの設定〉が表示されます

つまり、【HKEY_CURRENT_USER\Control Panel\DESKTOP】−【Wallpaper】
の設定が、僕が今使っているから【森】だったけど、金菜先輩が使っている
時には、別の壁紙になっているってこと
あ、いろんな人が使ってるときの話ね
そうそう、ひとつのコンピューターを複数の人が使う〈マルチユーザー〉
の時には、ユーザーごとにレジストリの設定が作られて、ログオンした人に
合わせて【HKEY_CURRENT_USER】の中身が差し替えられるってわけ
それってどんな意味があるの?
プログラムを作るのが楽ってこと。プログラムが【HKEY_CURRENT_USER】
に書き込むようにすれば、それだけでマルチユーザーに対応する
自動的に、設定を使う人ごとに分けられるってことなんだ!
これがレジストリに設定を書き込む理由。これを使わないで、ユーザーご
とに設定を作るとなると大変なんだ、これが
ってゆーか、マルチユーザーなんて考えてなかったかも
そういうの意識しなくていいっていうのもメリットかもね。さて、この
【HKEY_CURRENT_USER】の下の方に【Software】ってあるでしょ
うんあるよ。オープン
 中には Adobe や Microsoft など、ソフトウェアメーカーの名前が並んで
いる。
ここってアプリの設定が書き込まれてるの?
そう、この階層にメーカー、1つ下にアプリ、そこに各データ。つまり
 Calc のアプリもここに書き込むってことねー
そういうこと。じゃ、プログラムの作成に入ろうか。まずは、レジストリ
への書き込みから。【OK】ボタンを押したときの処理はどこに書くんだっ
け?
 CCalcApp::InitInstance() の……

    if (nResponse == IDOK)
    {
        // TODO: ダイアログが <OK> で消された時のコードを
        //       記述してください。
    }

の TODO のとこ!
そうでした。じゃ、この部分に次のプログラムを書き込んで

        SetRegistryKey( "KamichanFactory" );
        WriteProfileInt( "CalcDialog", "Ans", dlg.m_iAns );


これは試してみた方が早いかな
んじゃビルドして実行、 200 + 150 = 350 で【OK】ボタン! ……で?
レジストリエディタのメニューから【表示】−【最新の情報に更新】を選
んで
更新! ……あーっ!!
 【HKEY_CURRENT_USER\Software】に【KamichanFactory】というキーが新
たに生まれている。
なんか、ちゃんとしたメーカーのアプリみたい……
この名前が、このプログラムで使ってる CWinApp::SetRegistryKey() で
渡したのね
で、この下には……
 【KamichanFactory】の下には【CALC】−【CalcDialog】と続いている。
【CALC】はアプリの名前、【CalcDialog】は CWinApp::WriteProfileInt() 
の第1引数
んでこれを選択すると……
 右側のリストに【Ans】−【0x000000c8(350)】と表示されている。
ってことは【Ans】は CWinApp::WriteProfileInt() の第2引数で、……
次のなに?
 dlg.m_iAns ってなんだったか忘れたの?
計算した答……あ、さっき 350 って答出したんだよね、そういえば
というわけでまとめると、 CWinApp::SetRegistryKey() と
CWinApp::WriteProfileInt() を使うことで……

【 SetRegistryKey() の第1引数\アプリ名\ WriteProfileInt() の第1引数】
−【第2引数:第3引数】

って形で整数値を書き込めるってわけ
おお!
ちなみに文字列を書き込むときには CWinApp::WriteProfileString() を
使います。逆にレジストリから値を取るときは CWinApp::GetProfileInt() 
を使います
なんだ、分かっちゃうと簡単よねー
まーね。ちなみにこれは MFC を使ってるから
 API だと大変?
かなりね。ところで、キーの名前は今勝手に決めちゃったけど
あたしの好きにしちゃっていいってことだよね。 KamichanCorp. とか
そ。ま、日本語はやめといた方がいいかな
はーい
んじゃ今度は、値の取得をしてみましょう。やってみる?
えええ??? なんかすごく難しくない?
そんなことないでしょ。前回の最後にやったでしょ、〈ダイアログを表示
するときに答に値を入れておく〉っていうの
あー、あれってこれの前振り?
もちろん、そういうふうに順序立ててるんだよー、ちゃんと
苦労かけるねぇ
んじゃがんばって
……えーっと、この前は

    dlg.m_iAns = 100;
    int nResponse = dlg.DoModal();

ってことは、この 100 の代わりに、レジストリから持ってきたのにすれ
ばいいんだから……さっき CWinApp::GetProfileInt() でって言ってたよね
言ったよ。そしたら?
困ったときのMSDN! MSDN開いて、えーっと
こういうときはメンバ関数だけで探した方がいいよ
んじゃ GetProfileInt() って書いて、下のリストからダブルクリック!
 MSDNに CWinApp::GetProfileInt() の情報が表示される。
な、なんか難しい……
うん、難しいね
……
でもこれ、 CWinApp::WriteProfileInt() と似てない?
あ、そういえば……

BOOL WriteProfileInt( LPCTSTR lpszSection, LPCTSTR lpszEntry, int nValue );
UINT GetProfileInt( LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault );

こんなふうに比べてみれば分かるとおり、第1引数と第2引数は同じ意味
あ、ってことは同じのを渡せばいいんだ。ってことは、レジストリからの
は第3引数から取れるの?
取れない取れない。第3引数は〈まだ書き込まれてなかったときの値〉。
0がいいかな
じゃーどうやって値取んの?
関数から値を返してもらう方法、なんだっけ
……あ、戻り値!?
そう。レジストリから拾った値は GetProfileInt() の戻り値として返っ
てきます
でも UINT って変なのだよ
今のところは、 int と同じって考えていいから
あ、つまりフツーの数字ってことね
じゃ、どうなる?
えーっと、さっきの 100 のとこに……

    dlg.m_iAns = GetProfileInt();

で、第1引数と第2引数は同じなんだから……

    dlg.m_iAns = GetProfileInt( "CalcDialog", "Ans" );

んで、第3引数は 0 にしとけばいいっぽいから
あ、あとこの前に SetRegistryKey() を呼んでおかないといけないから
そっか、それのと組み合わせて、書き込むとことか指定するんだもんね。
じゃ、こんな感じかな?

    SetRegistryKey( "KamichanFactory" );
    dlg.m_iAns = GetProfileInt( "CalcDialog", "Ans", 0 );

そういうこと!

/*
    Preview Next Story!
*/
ところで 【KamichanFactory】 って作ったら、削除はどうすんの?
ぎくっ
どしたの?
いやね、 MFC を使ってレジストリのキーを削除する方法はないんだよね
ってことは……
作りっぱなし……
というわけで次回
< Version 3.20 CString とストリングテーブル >
につづく!!
あんたってときどきむっちゃテキトー
テキトーじゃなきゃこんな長引かなかったってことで
はいはい
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。