「何か。」のゴースト製作記(15)(2002/04/07)
新着情報 トップメニュー ボードメニュー 掲示板 お手紙はここ!

この一週間はあんまり進展してない……(^-^;) 自分でソースを修正しておいて、スクリプトのほうを訂正してないとか……そんなイージーミス連発。あと、いつのまにか寝てしまっており、夜中の節電強制切断(自作ツール)で更新を失ったりとか……手戻り多いんだよな。

アーカイブするほどではないのでネットワーク更新だけ……と思ってたら駄目。ネットワーク更新用アドレスが古いほうなんだもん。暫くは両方を使わんといけませんかね〜。ぬう〜。
ひいなに喋らせるか……



例の、SHIORI から DirectSSTP でリクエストすると落ちる件で……その後の調べではどうやら SendMessage した後で返ってくる WM_COPYDATA を処理するときに、グローバルメモリの開放でトチっているらしいことが判明。
そうは言うものの、TCopyDataStruct.lpData を「グローバルメモリハンドルのポインタ」として扱うのか、単にグローバルメモリのハンドルそのものを便宜上キャストしてるだけなのかがハッキリしなくてスッキリしない。場所場所によって違う感じなのですよ。気のせい? 何か前提が間違ってる?

GlobalFree( HGLOBAL(TCopyDataStruct.lpData) )
GlobalFree( HGLOBAL(TCopyDataStruct.lpData^) )

これらのどちらとも、うまく行くケースとうまく行かないケースが入れ替わるんです。何故?

しかも Delphi の統合環境からだとちゃんと動く(汗)

……意図的にリークして欲しいのですか? あなたは?(←本体)



インターネットに接続/切断したら通知するようにしました。って言うか、結構難儀でした(^-^;) とりあえず、VCL を使ったアプリケーションでなければ、スレッドからのメソッド呼び出しで Syncronize を使う必要は無かったんですな……。同期待ちでスレッドがストールしちまいやがんの(汗)
だいぶ前から実装してたのにちゃんと動かなかったのはそのせいか……

まぁしかし、こんなのはおまけ反応であるからして。



重大な変更としてはシェルスクリプトオーバーライドを実装した事。起動・ゴースト変更・シェル変更のときに、そのシェルのフォルダから event.txt を読み込んで、そのイベントハンドラをゴーストのそれより優先する事。つまり、起動時の挨拶なんかをシェルごとに設定できると言う物。
昔は本体側にありました……ていうか、古い話か。まだ PIRO があった…… Inverse までかな? まぁそう言うわ訳でゴーストレベルで復活させてみました……使い道がないけど(^-^;)

その為に TStringList を継承して TEventStrings を作成、内部で「ゴーストレベルのイベントハンドラ」「シェルレベルのイベントハンドラ」それから「スクリプトローカルのイベントハンドラ」を後者から先に調べて、反応が見付かったところでリターンするようにしました。

最後のは、スクリプトの中でメニュー選択をさせた場合にその場限りのリアクションをその時点で設定してしまえるように……と設計したものの、スクリプトの方でどうやって書式すべきか全然、決まっちゃいません。ベタに書くと可読性が雲散霧消してしまうのですが……しょうがないような気は、しています。



あと、右クリックでのメニューを実装しました! 産むが易しでやってみれば何ということもなく。ポップアップメニューなんざヘタすると普通のウィンドウを作るより簡単かもしれません(^-^;)

メニューを選択した場合の処理はメッセージで受け取るので、そのままさくら¢、のウィンドウハンドルに投げさせて、WM_COMMAND の wParam の下位ワードに入るメニュー ID で分岐、識別。これまためちゃめちゃ簡単。

問題は、識別したメニューをどうやって本体に処理させるか……でありまして、そこからリクエストヘッダそして WM_COPYDATA を捏造して本体に落とすことを考えて……面倒なので既存の DirectSSTP クラスからイベントをリクエストする手抜きを敢行。
ウィンドウプロシージャの再入をしつつもちゃんと動いています。我ながら良くバグらないものだと思いますが……。

メニュー項目の内、システム依存のものは MATERIA-B で拡張された ¥![...] で対応。フリートークや辞書リロードや終了なんかは自前で処理。
ああ、でも、ゴースト・シェル・バルーンは自分でリストを作っても知れてるのでポップアップに列挙させようと思います。宿題宿題。

ちなみに元々のメニューは [Shift+右クリック]で出ます。おめでとう。
でもって本体ダブルクリックでのバルーンに出るメニューは温存しておくことに……。主要なのはポップアップに移しましたが、全部移すと結局はアクセシビリティが低下するので、共存共存。
Shift+左ダブルクリックでフリートークしたものかどうか思案中。

「お勧め」サイトとかもポップアップしたほうが良いのかな? トップレベルに項目を増やしたくないし、だからと言って多階層化する必要があるかどうか。ぎもーん。

あと、うにゅう¢、もメニュー置き換えちゃお。



ウィンドウプロシージャの置き換えを行うタイミングが不本意。今のところ、OnFirstBoot OnBoor OnChostChanged で処理しています。OnShow 的な共通のイベントがあれば簡単なのですが、これに変わるものは OnSecondChange ぐらいとか……いくらなんでも毎秒処理する気にはなれません。
load() でやれればそれに越した事はないものの、この時点では(単体起動のときには)まだメモリマップトファイルが存在せず、自分のハンドルを取得できないので、置き換えるべきウィンドウを識別できません。
この問題は完全に「卵と鶏」の関係なので多分、どうしようもないらしい。

当座の間はこのままで行く他はあるまい。



Operation雛≠フ配布サイトを替えました。これからはkissa.dip.jpで配布する事にします……ここは、「何か。」ゴースト配布者専用のフリーウェブスペースです。……よほど不便を感じなければここで落ち着きたいなあ(^-^;)

と、いうわけで最新版 0.2.11.92 はこちらのページからダウンロードして下され。

……って思ったら何か繋がんねぇでやんの(汗) なんでアップロードしようとするときに限って止まりますか? NLST オプション無し、-La、-alL、全部駄目。むう。後日だ後日ッ!


新着情報 トップメニュー ボードメニュー 掲示板 お手紙はここ!