第7回 レジストリ

このページをDeliciousに追加 このページをはてなブックマークに追加 このページをYahoo!ブックマークに追加

2002年12月28日(土)版

第7回 レジストリ

"ソフコン2002 3rd Edition featuring l'agenda" - l'agendaでソフトを作ろう!

←第6回へ↑↑コンテストTOPへ↑↑→第8回へ

■レジストリとフラッシュメモリ

 l'agenda特有のフラッシュメモリとRAMの二重構造によってプログラマにとって、ファイルの保存位置の他に問題になるのはレジストリである。実はレジストリも高速化を図るためキャッシュされている。そのため、レジストリの変更を行っても、キャッシュされたレジストリをフラッシュメモリに書き戻さない限り、リセットするとレジストリへの変更内容も消えてしまうのである。

 そこで、レジストリをフラッシュメモリに書き戻す関数が用意されている。


#include <GetDisk.h>

CGDFlushRegistry();


 このCGDFlushRegistry関数を呼び戻すことによってレジストリの変更がフラッシュメモリに反映される。
なお、CGDFlushRegistry関数を使うときには、第6回で紹介したGetUserDiskNameと同様にGetDisk.lib ファイルをリンクしなくてはならない。[プロジェクト]-[設定]の「リンク」で「オブジェクト/ライブラリ モジュール」にGetDisk.lib を付け加えよう。



■レジストリフラッシュのタイミング

 この関数を呼び出すとフラッシュメモリに書き込むため、当然処理時間がかかる。この関数を呼び出すのは、レジストリへの変更が一段落してからにしたい。

 かといって、プログラムの終了時にだけやればよい、というわけにはいかない。なぜなら(PocketPCでもそうだが)プログラムは他のプログラムに切り替えられはしても、終了はされず、起動されたままになっている場合が多い。そして、リセットされるときにも起動されたままになっていれば、それまでのレジストリへの変更は全て無効になってしまうわけである。そのため、レジストリを変更する一連の処理が終わったら、CGDFlushRegistryを呼び出す、ということになる。そして、終了時にも書き戻すようにしておけば、なお安全であろう。


悪い例:

AfxGetApp()->WriteProfileInt(_T("System"),_T("Data1"),0);
CGDFlushRegistry(); // 書き込むたびにフラッシュ
AfxGetApp()->WriteProfileInt(_T("System"),_T("Data2"),0);
CGDFlushRegistry(); // 書き込むたびにフラッシュ
AfxGetApp()->WriteProfileInt(_T("System"),_T("Data3"),0);
CGDFlushRegistry(); // 書き込むたびにフラッシュ


良い例:

AfxGetApp()->WriteProfileInt(_T("System"),_T("Data1"),0);
AfxGetApp()->WriteProfileInt(_T("System"),_T("Data2"),0);
AfxGetApp()->WriteProfileInt(_T("System"),_T("Data3"),0);
CGDFlushRegistry(); // 最後に一回だけ

 既存のCE用マシンをBE500に対応させる場合、このレジストリの書き戻しに対応させることが多くの作業をしめるものと思われる。単純作業ではあるが、レジストリへの書込が多いソフトでは、変更箇所はかなり多くなる。当然、他のCE用SDKでは、CGDFlushRegistryはコンパイルエラーとなるので、既存ソフトとの切り分けで書いたような方法で、切り分けよう。



第7回 レジストリ

Reported by 古原伸介


Last-modified: Sun, 24 May 2009 23:45:30 JST (3737d)