::Filezを超えた?

Filezで、書き込めないデータベースを、


自作のファイラーを、機能アップして、書き込めた。

ワンハンド・ファイラーで、しかもDAのファイラーが、ここまで出来ていいの?

PalmInsiderProで、吸い出したファイルを、コマンド Eで、メモリー中にコピー

モリー内のDBを、コマンド Eで、外部ファイルにコピー

VoiceDialが、ROM表示になってるのは、ReadOnly属性が、立っているためです。
元々、ROMにあったDBの属性そのままコピーされてる証拠かな・・・

ROM判断を変更しました。また、Protectされていると赤表示に・・・

しかし、35kバイトまでに減量したのに、4kも増えてしまって、39kバイトに、なってしまった。

もうPalmInsiderProも、いらないかも? だって、UI懲りすぎで、使いにくいから・・

追記

**64kバイトの壁**

Palmには、幾つかの制限があるが、その中の一つに、「データベース内のリソースのサイズは、最大で、64kバイトまで」、というものがある。

1レコードの最大長も64kバイトまでだ。

この制限に従って、データ・マネージャーや、エクスチェンジ・マネージャーは、設計されているし、メモリーマネジャーすら64kの壁を持っている。

しかし最近は、実行コードを、ARMコードで作るソフトが、多くなっている。
ARMコードには、68kコードのように、32kの壁がないので、作ろうと思えば、64kを超える実行コードだって、簡単に作れてしまう。

何故、このような話しを、するかというと、今、解析中のソフトVoiceDialが、800kバイトを、超えるARMコードを、持っているのだ。

こういった、イレギュラーな、DBの場合、通常の手段では、外部にとりだせても、書き込む事は、できない。

実際に、私の作ったファイラーでも、書き込めないし、取り出せもしない。

で、ある人に、PalmInsiderProというファイラーを、教えてもらった。

この製品なら、書込みも、取り出しも可能だ。

ここからが、本題だ。

他人の作ったファイラーに出来て、自作のファイラーでは、出来ないというのは、問題である。

さらに、PalmInsiderProは、凝った作りで、スタイラスを、使わないとほとんど操作が、出来ないUIである。

タップ嫌いの私としては、PalmInsiderProは、使わないで済ませたい。

そこで、自作ファイラーに、機能追加を図って、完成にこぎつけた。

問題となったのは、800kもあるリソースを、どうやってデータベースに組み込むかだった。

プログラム内で、リソースを作って、データベースに組み込むのは、経験がある。
MemHandleNewを使い、必要なチャンクを用意して、HandleからPointerを、取得して、リソースを、書込み、DmAttachResouceで、データベースに追加する方法である。

しかし、MemHandleNewの最大サイズは、64kまで、そのたのデータベース・マネージャーのAPIも、64kまでのリソースしか、作れない。

そこで、ネットをさまよっていたら、ロシア人のフォーラムで、64k越えのHandleを取得する方法に、たどり着いた。

MemChunkNewを使う方法だ、これは、ローレベルのAPIで、システム専用APIとなっており、使ってはいけない物だが、しょうが無い。

で、何もかんがえないで、サンプルのまま使い、ファイルから読み込んだARMコードを、書き込んで、DmAttachResouceで、データベースに追加するまでは、完了するのだが、
通常なら、追加が終わった時点で、自前で用意した、チャンクを、Freeするのだが、これを行うと、エラーを起こしリセットされてしまう。

かといって、Freeしないで、終わろうとすると、「チャンクを開放してないよ」
「メモリーが、DBのよって、ロックされたままだよ」というエラーが出て、Palm機器は、不安定な状態になり、いつ爆発するか、わかったもんじゃない。

Freeしないでも、怒られない方法は、自前で、用意したHandleを、システムのものだよと、詐称してしまう方法があるが、表面上のエラーを回避しただけで、問題は、解決されていない。

「メモリーが、DBによって、ロックされたままだよ」というエラーも、Attachした後に、そのリソースを、読み込んで、Lock,Unlockすると、解決した。

しかし、すっきりした訳ではなく、二日ばかり、悩んだ末に、ロシア人の作った方法を、そのまま使うのをやめることで、解決した。

要点は、
・移動可能なChunkは、Handleで、移動不可のChunkは、Ptrである。
・データベース・マネージャーは、想定外の大きさのChunkは、ストレージ・ヒープにコピーできないので、そのまま使おうとする。

さらに、まったく逆の、メモリーから、外部メモリーへの吸出しロジックも組んだ。

・ヘッダー情報を、読み込み
・全てのリソース情報を、吸い出して
・リソース用のインデックスを作り
・ヘッダーとインデックスを、外部ファイルに書き出す。
・あとは、リソースのChunkを、その後に、順次、書き出すだけ。

もちろんテストには、VoiceDial.prcを使った。

外部ファイルのVoiceDial.prcを、メモリーにコピーして、ReadOnly属性とか、コピープロテクト属性を、色々変えながら、吸出しテストを繰り返した。

で、最後にオリジナルのVoiceDial.prcと、コピー。コピーしたVoiceDial.prcの、
バイナリ比較。

「むむ、1バイトの差があるぞ・・・」

見てみると、データベースを、何回更新したかの情報が、違ってした。

そう、メモリー中で、属性を、変えた回数が、違ったのだ・・・