| ■ プロパティーシートのシステムエラー |
| プロパティシートを作成していた時のことです。 サンプルソースコードを参考に、3ページのプロパティページを持つシートを作成しました。 作成後、実行させると見た目は何の問題もなく動きました。ところがMSDEVのデバッグ表示を見ると、例外処理 (初回) は XXX.exe (COMCTL32.DLL) にあります: 0xC0000005: Access Violation。と出ています。 サンプルプログラムの方は、何も出ていません。気になったので、ページを減らしたりしましたが結果は変わりません。 1ページにしてコントロールを全て消し、ソースの方も裸にしても変わりません。 サンプルが英語だったのでリソースのプロパティを英語に変えて実行すると、・・・・・エラーが消えました。 日本語が駄目なのかと思い、諦めようと思いましたが、試しに日本語でフォントサイズを変えると・・・消えました。 結局わかったことは、MSPゴシックでサイズ9(デフォルト)が、駄目なようです。 非常に疲れました。 |
| ■ボタンにビットマップが表示できない。(プログラミングメモ参照) |
| 何年か前に、ビットマップを使ったボタンを作成しようと思い、サンプル(V4.2)を探したところコントロール集のようなものに載っていたので、それを使いました。 しかしこのボタンは、3Dボタン全体をビットマップとして登録するもので、通常の状態、押した状態、フォーカスされた状態、仕様不可の状態全てのビットマップを作らなければならないので非常に面倒です。 ボタンのプロパティのスタイルのビットマップをクリックすればできると思い、ビットマップの変数を作りLoadBitmapでビットマップを読み、更にボタンもコントロール変数にしSetBitmapでこのビットマップを読込みました。 そして実行させると、・・・・ビットマップが表示されません。 どうして??散々あがいた後、わかったことはビットマップ変数をクラスのメンバにしないと駄目だということでした。 言い方を変えると、ローカル変数では処理後、消滅してしまうので表示されないようです。 ボタンの方でビットマップデータをコピーしてくれると思いましたが間違いでした。 表示された時はうれしかったです。 |
| ■"リソース不足"のエラーでシステムダウン |
| 以前、仕事で作成したアプリケーションを出荷前テストに出した時のことです。 あるダイアログを何回か開いたり閉じたりしていると、ある時点で"リソース不足"のシステムエラーでプログラムがダウンするという報告を受けました。さっそく私のPCで確認しようとしましたが、何度行ってもそのエラーが出ません。 他のダイアログとの違いを考えてみましたが、大きな違いはダイアログの一部に描画エリアを持つことと、大き目のフォントで数字情報を表示している点でした。 ヘルプファイルを見回した結果、原因はどうやらフォントだった様です。というのは、このダイアログではCreateFontIndirect()によりフォントを作成していましたが、ダイアログ消滅時にDeleteObject()を行っていませんでした。フォントの構造はよくわかりませんが多分日本語なので結構な量のメモリを消費していたのかもしれません。また、私の使用しているPCではなぜ落ちなかったのかは、未だに明白では有りませんが、可能性としてはWindows-NT4.0のSPのバージョンの違いかも知れません。製品はSP4で、私のはSP5でした。 |
| ■ウィンドウ・アプリケーションの最小経過時間の取得(ftimeの罠) |
| これは、仕事のテストプログラムを作成していた時のことです。ある処理で、サンプリング(経過時間の取得)が必要となりました。 私は、以前使ったftime()でミリ秒まで取得できることを知っていたのでこれを使いました。そして使用者が時間のパラメータを設定しその時間とサンプル時間を比較して処理をするはずでしたが、使用者が言うには10msecを入力しても、20msecを指定しても結果が変わらないとの報告が有りました。私は、元々取得時間の単位がmsecだったので最小誤差は数msecだと思い込んでいましたがこれがそもそもの間違いでした。 というのは、デバッグ文でftime()だけをループさせ取得時間を表示してみたところ以下の様になりました。 210,210,210,210,210,210,226,226,226,226,226,226,226,226,243,243,243,243,,,,,,,,,, どうも、取得すべきシステムタイムが更新されていないようです。MicrosoftのHPを見回してみたところ、詳細は忘れましたが、「CPUに依存するウィンドウのタスク遷移時間は数十msecかかる」様な事が書いてありました。 そこで私は、次に新たなスレッドを作成し、その優先度を最高にしそこで同じ実験をしてみました。しかし結果は同じでした。 OnTimerも試しましたが、同様の結果でした。 何か手はないかと、HPをいろいろと見ていたらGetTickCount()という関数が有ることを発見しました。これは「Windows 起動からの経過時間を、ミリ秒単位で取得します。」というものですが、この関数を使用したら、殆ど処理時間だけのロスを含む結果を得ることができました。やはり数msecの誤差は有りますが、CPUが早いものほど精度が上がります。 |