"ソフコン2002 3rd Edition featuring l'agenda"
第7回 レジストリ

l'agenda特有のフラッシュメモリとRAMの二重構造により,レジストリに関しても特殊な取り扱いが必要になる。

【国内記事】 2001年12月28日更新


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

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

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

#include <COShellApi.h>
CGDFlushRegistry();

 このCGDFlushRegistry関数を呼び戻すことによってレジストリの変更がフラッシュメモリに反映される。

 なお,CGDFlushRegistry関数を使うときには,CoShellAPI.lib ファイルをリンクしなくてはならない。[プロジェクト]-[設定]の「リンク」で「オブジェクト/ライブラリ モジュール」にCoShellAPI.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用マシンをl'agendaに対応させる場合,このレジストリの書き戻しに対応させることが多くの作業を占めるものと思われる。単純作業ではあるが,レジストリへの書き込が多いソフトでは,変更箇所はかなり多くなる。当然,ほかのCE用SDKでは,CGDFlushRegistryはコンパイルエラーとなるので,既存ソフトとの切り分けで書いたような方法で,切り分けよう。

関連記事
▼ Windows CEソフトウェアコンテスト2002 3rd Edition featuring l'agenda開催
▼ 第1回 開発環境を入手しよう!
▼ 第2回 ラジェンダの特徴
▼ 第3回 開発環境のインストール
▼ 第4回 作ったソフトを動かすには?
▼ 第5回 既存ソフトとの切り分け
▼ 第6回 ファイル構造

関連リンク
▼ コンテストエントリーページ
▼ 開発者向けラジェンダ開発掲示板
▼ eMbedded Visual Tools 3.0連載記事 - WindowsCE FAN
▼ マイクロソフト Windows Embedded

[古原伸介,ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.



モバイルショップ

最新スペック搭載ゲームパソコン
高性能でゲームが快適なのは
ドスパラゲームパソコンガレリア!

最新CPU搭載パソコンはドスパラで!!
第3世代インテルCoreプロセッサー搭載PC ドスパラはスピード出荷でお届けします!!