Fasie7 1.16 リリース
ツイート1.クラッシュする原因を「多分」ほぼ特定し、クラッシュしないようにした。
2.ツールバーの検索コマンドの結果をドラッグアンドドロップ可能にした。
3.お気に入りメニューの起動キーをエクスプローラからだけではなく、
どのようなウィンドウがアクティブ時でも表示できるようにした。
(追記:これはキーによる起動のみ対応)
4.マウスジェスチャーの「コマンドバー上」でタスク選択メニューを選択しても機能していない問題を修正
5.エクスプローラ再起動時にタスクトレイアイコンがなくなってしまわないようにした。
6.ツールバーのカスタマイズがセーブされない問題を修正
7.設定ダイアログで、お気に入りメニューの起動キーの設定を「その他」タブから「お気に入り」タブへ移動
ダウンロードは右側のリンクから
ファイル名:fse7116setup.zip
ファイル日時2014年2月16日12:36:12
ファイルサイズ849 KB (870,384 バイト)
これまでの実行ファイルではなく、zipファイルにしたのは、署名付きファイルではないので危険なファイルとブラウザが判定してしまうからです。
zipファイル中に実行ファイルがあります。セキュリティチェックはアップロード前に事前に行っていますが、お使いのウィルス対策ソフトが危険と判定するかもしれません。
このドメイン名もGmailからすればスパム扱いですから(涙)
つまり、作者から送られてくるFasie7も含めたシェアウェアのパスワードの入ったメールは、迷惑メールフォルダに勝手に分類されるときがありますので、特にGmailで送金確認メールを送ってくる方は注意してください。
やっとFasie7がまともに動くようになりました(笑)。最初のリリースからもう2年も経っている。
今までずっと使っていて、なぜかクラッシュするときがあって、その原因がわからないままだったのですが、どういうときに起きるのか全く不明でした。
しかし、WinDiffという開発ツールの1つを使うと必ずクラッシュするので、原因がぱっとひらめいた。
「ああ、UIAutomationは複数のスレッドから同時アクセスしては駄目なのか!」
それで、ガチガチにスレッド制御関数を使って排他処理を行ったら、クラッシュしなくなった。でも、悔しいかなまたもや普通に使っていたらクラッシュした。特にプログラム開発(Fasie7ではない)をしていると、激しい使い方をするのでクラッシュするのだ。それで、悟った。UIAutomationオブジェクトは、あらゆるスレッドで使い回しをするのではなく、使うスレッドごとに作成すればいいのだ…と。
最近のオブジェクト指向言語はこのようなことは出来ないと思うが、C++はC言語の仕様をほぼ包含しているから、安直にグローバル変数を定義できてしまうのだ。それで今までは単一のUIAutomationオブジェクトをグローバル変数にして、いろんなスレッドからアクセスしていたのだ。これだと関数の引数も削減できるし、逐一オブジェクトを生成するコードを記述する必要も無い。しかし、それだとクラッシュしてしまうのだ。
こう書くと、なんと馬鹿なことをしているのだと思われる方も多かろうが、COM(Component Object Model)とCOMのインターフェイスの一つであるUIAutomationの使い方はろくな使い方が載っていないので試行錯誤だったのだ。クラッシュしたときも、どこがクラッシュするかデバッガが教えてくれないし(マルチスレッドアプリやCOMコンポーネントでなければすぐにわかっただろう)、クラッシュした後でもスピードが遅くなって使えてしまうときがあるので何が原因なのかわからないのだ。
そもそもCOMのインターフェイスの作成はnew演算子でやるのに開放はdeleteではなくRelease()を呼び出すというのは、C++の言語仕様からすれば勘違いをしてしまう。Microsoftはなぜそのような仕様しなければならないのか、説明しているのだろうが、なんせMicrosoftはCOMやOLEの説明にかぎらず、各APIの説明は非常に表面的、もしくは表面的に高尚さを装っているので、実際の仕様決定した泥臭い本当の理由を述べていないから非常にわかりづらいのだ。だから最低でも完全に動くサンプルプログラムを全てのAPI関数のドキュメントに入れておくべきだと思うね。
C言語を勉強していたときも、strcat()という文字列をくっつけるライブラリ関数を使うとき、最初私は第一引数にくっつける文字列変数の先頭のポインタではなく、最後の文字を示すポインタの一つ後、つまり終端を示すヌル文字のあるポインタを入れて使っていた。そうしないと、第一引数の文字列が上書きされると思ったからだ。Cのランタイムでもこの有様なんだから、サンプルコードと言うのは絶対必要だ。
閑話休題、UIAutomationオブジェクトをスレッド作成ごとに作成するのはスピードが低下するかもしれないと思ったが、実際は逆だった。今まではなんだかもっさりした感じで要するに単一のUIAutomationオブジェクトが複数スレッドからアクセスされてそれが原因で腹がもたれるような遅延が起こっていたのだろう。今はしゃきしゃき動いていて、間違った挙動(指定した表示にならない)も起きなくなった。機敏に動作するのは設定ダイアログで遅延時間を大幅に少なくしたからなのであるが、1msに設定しても根本的なクラッシュの原因を取り除いているので今のところ不具合は出ていない。(Corei3を1.6GHz固定で使っています。追記:1msだとクラッシュした。今は5msで使用中)
UIAutomationオブジェクトは、エクスプローラがアクティブでないときは完全に消えているので、前バージョンに比べて他のプログラムに悪影響を与えていないと思います。
これに気をよくして、他にもあった今まで気になっていた問題をいくつか解決したのが今回のリリースです。
3番のどのウィンドウ上でも可能になった、お気に入りメニュー表示は、全てのウィンドウで可能になる訳ではありません。原因は不明ですが、秀丸ではうまくいきません。
前バージョンより、よりプログラムに悪影響を与えないようプログラムしてありますが。
Posted: 2014 年 2月 16 日, カテゴリー Fasie7.