netail.net
自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.
最近のお知らせ (古いものはこちら)
2004-07-18 古い日記からの変換データ ▲
_ [hyCalendar] GetPrivateProfileString の仕様 ▲
hyCalendar が Windows 98 で動かなかった問題の原因が何となく判明.
INIファイル読み込みに使われる関数 GetPrivateProfileString についての MSDN ライブラリの説明に,読み込みに失敗したときに使われる lpDefault パラメータに関して次のようなOS限定の記述があった.
Windows Me/98/95: Although lpDefault is declared as a constant parameter, the system strips any trailing blanks by inserting a null character into the lpDefault string before copying it to the lpReturnedString buffer.
で,TODO文字列のデフォルト値は 'TODO: ' という定数で,文字列はおそらくポインタで渡されているだろうから,定数値を書き換えようとしてアクセス違反が起きていた,という仮説が有力になってきた.
TIniFile.ValueExists などのデフォルト値を伴わない処理を使ったら(読み出しには同じ関数を使うが),アクセス違反は起きなくなった.
ValueExists は毎回,指定したセクションのキーのリストをいちいち読み出すので読み出しのコストが上がってしまう.定数をCopy関数による明示的コピーで一時変数に格納してから読み出すようにするか,デフォルト値から空白を取り除くか.どちらでも問題は回避できることを Windows 98 上で確認した.
さすがに無駄なコピーを作ると将来(人かコンパイラが)消してしまう可能性があるので,あからさまなデフォルト値を設定しておいて,その値が使用されたら,本来の空白を含んだ初期値に変更する方法にする方向で修正してみることにする.