まとまった時間が取れたので、機能追加。
自動ログと文字入力部のヒストリ。
まず、メニューの整理
ファイル
-終了
オプション
-マイクの設定
-音量の設定
-DirectPlayVoiceの設定をやり直す
-ログの設定
ヘルプ
-項目
-このコンピュータの情報
-バージョン情報
てな感じに落ち着く
んで、オプションのログの設定で、ログを出力するかしないかのチェックボックスと、出力するならどこに出力するかのパス設定をさせることとする。
デフォルトでは、ログは出力しない。するとするならばカレントフォルダ。すなわち、インストールしたフォルダ。
前回の記事で、
オプションのダイアログを作って、そこでログの生成先を指定させる。んで、チェックボックスでログのON/OFF。ファイルは日付ごとに分割して生成されることも考えたけど、日付が変わる瞬間とか考えるのが面倒なので、1個のファイルにどんどん生成するようにするつもり。
と書いたけど一部変更。結局アプリが最初にログを書き込む時間を使ってファイル名を生成するようにした。
細かい話で、そんなことはまずありえへんと思うけど、一応。
2重起動した場合にも時刻を使ってファイル名を生成しておけば、ログの重複を避けることができる可能性が高い。
アプリを起動時には、Writeでロック。というのは、書いてる最中にファイルを他のアプリで開かれてWriteでロックかけられると泣いちゃうから。
面倒だけど、いちいちFlushかけてる。もちろんアップデートで最後の行だけ。。
ついでにログの中には発言時刻も埋めた。
画面にも出してみたけど、うっとうしかったのでやめた。
そして本日のメインイベント、文字入力部のヒストリ
毎度のことながら、楽する方法はないかと、Webをぶらぶら眺めてお勉強。
まず最初に見つけたのが、SHAutoCompleteという関数。こいつはフォルダやファイル、URLの履歴や最近使ったURLを出してくれるためのAPI。EditBoxのハンドルを渡すだけというとっても簡単な方法。
暁の傭兵そふとはうすというサイトのオートコンプリート機能を付ける[簡易編]に詳しい記述がある。
おいらがやりたいオートコンプリートは自前の文字列。これでは使えない。
詳しく読んでいくと、CLSID_AutoCompleteというオブジェクトがShellにあるらしい。インターフェースはIAutoComplete。とIAutoComplete2。いやぁ、世の中には便利なものがあるもんだね。このオブジェクトは、EditBoxのハンドルとIEnumStringを渡してやると、IEnumStringの内容に従ってオートコンプリートしてくれる。
暁の傭兵そふとはうすというサイトのオートコンプリート機能を付ける[OLE]に詳しい記述がある。
ほいほいと、CEnumStringクラスを作る。先のサイトにあったサンプルコードは生のインターフェースを使っているので、おいらは、ATLを使って実装。文字列周りもCComBSTRなどに書き直して完成。多少動作効率が悪くても誤差の範囲なので、既存のものを使いまわすのがおらの基本方針。
簡単なテストプログラムを作って実験。一発で動く。うーん。AutoCompleteって楽しい。。。
次に本丸、VoiceChatに導入。
これがどーよ。世の中そんなに甘くない。うごかへん。CLSID_AutoCompleteのCoCreateInstanceに失敗しよる。エラーは、E_NOINTERFACE。なんでぇなぁ。さっきのテストプログラムで動いてたやん。うきぃ~。
調べていくと、CoInitializeExが悪さをしている模様。
何故かVoiceChatは、
CoInitializeEx( NULL, COINIT_MULTITHREADED);
で動いてた。
以前、DirectPlayってMultiThreadで動いてるよなぁ。だから、COINIT_MULTITHREADで動かしたほうが楽なんだよなぁって安直に思ったからなのか、それとも何かDirectPlayに具体的に問題があって、COINIT_MULTITHREADにしたのか記憶がない。うーん。なんで俺、COINIT_MULTITHREADにしたんだろう。なんか理由があったような気がするんだけどなぁ。何かがCoCreateできなかったような記憶もあるんだけど。しかし、アパートにしても別に問題なく動いてる。うーん。なんでやろ。まぁあとから思い出すやろ。そのときのためにちゃんと書き残しておこう。
ということで、アパートを修正したらちゃんとAutoCompleteができるようになった。
うーん。楽しい。
一応、1.0.2.0で予定していた実装はすべて終了。
これからのんびり、テストをしながらヘルプを修正していきます。
CoUninitialize
先日の「なんで俺、COINIT_MULTITHREADでうごかしてたんやろ。」の原因が究明された。…