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

MATERIA period 568 から発表された次世代リクエストヘッダ SHIORI/3.0 に移行してみました。正式じゃないのでいつ変更されるとも知れませんが(^-^;)

アップデートが遅れてる理由は、どうにも安定しなかったからで……。あちこち試してる間にバランスが取れたようなので本日更新。
でもいつエンバグするか知れたもんじゃないなぁ(笑)



何時の間にか御影さくらちゃんが起動できるようになってました。これでマシンを別にする必要無いですねい。うへらうへら。ついでにこの8ヶ月ぐらい全くチェックしてなかったゴーストをがしがしインストール。

絵柄から言うと御影さくらがクリティカルヒット、他にはあるととか美耳とか。結構、定番(^-^;)
っていうか、どうせだったら絵からはいんないと(爆)



して SHIORI/3.0 ですが……パーサが簡素化できると言う触れこみ……いや、俺みたいにパーサ書かないで手抜きしてる者にとっては関係なし。
てゆうか、今までのに合わせたパーツを書いてた SHIORI 作者は結局は書き直しで、手間から言って簡略化も何もないような……。いや、新規に組むなら別ですけど。

っていうか、パーサなんて速度もひっくるめて、そう差別化できるモンでもないわけですから、ライブラリ作っちゃったほうが世のため人のため……?
……。
いや、俺? 俺のは超手抜きですから……(笑)

const
    AST: function(const S1,S2:String): Boolean= SysUtils.AnsiSameText;


function GetString( ID:String ): String;
begin
    if      AST( ID, 'name'                  ) then Result := 'Opration HIINA'
    else if AST( ID, 'version'               ) then Result := GetDllVersion( GhostDescript.KernelLib )
    else if AST( ID, 'username'              ) then Result := UserName
    else if AST( ID, 'sakura.portalsites'    ) then Result := GhostDescript.PortalSightList
    else if AST( ID, 'sakura.recommendsites' ) then Result := GhostDescript.RecommendSightList
    else if AST( ID, 'kero.recommendsites'   ) then Result := GhostDescript.UnrecommendSightList
    else Result := GhostDescript.Read( ID, '' );

    if (Result <> '') then Result := MakeResponce( rrOK, BuildScript( Result ) );
end;


function Get( Header:TRequestStrings ): String;
begin
    (* ゴースト設定を読みこむ *)
    Result := GetString( Header.Values['ID'] );

    (* ゴースト設定ではないみたいなのでイベントとして処理してみる *)
    if (Result = '') then Result := GetEvent( Header );

    (* 未対応ヘッダはログへ落とす *)
    if (Result = '') then
        if not AMT( Header.Values['ID'], ['OnSecondChange','OnMouseMove','OnMouseClick','OnMinuteChange','OnKeyPress'] ) then
            DebugfOut( 'NotImplement in Get()', Header.Values['ID'] );
end;


function request( H:HGLOBAL; var Len:LongInt ): HGLOBAL; cdecl;
var
    I  : Integer;
    Cmd: String;
    Scr: String;
    function Requested( Head:String ):Boolean; begin Result := AST( Cmd, Head ) end;
begin
    (* リクエストヘッダを TStrings で扱えるようにしてやる *)
    RequestHeader.Text := GlobalHandleToStr( H, Len, True );
    for I:=0 to RequestHeader.Count-1 do RequestHeader.Strings[I] := StringReplace( RequestHeader.Strings[I], ': ', '=', [] );

    (* ヘッダを調べて処理の分岐 *)
    try
        Cmd := RequestHeader.Strings[0]; // Requested 内で繰り返し呼ぶより、ちょっとは高速化するかな~って
        Scr := '';

        if      Requested( 'GET SHIORI/3.0'         ) then Scr := Get(    RequestHeader )
        else if Requested( 'NOTIFY SHIORI/3.0'      ) then Scr := Notify( RequestHeader )
        else if Requested( 'TRANSLATE SHIORI/3.0'   ) then Scr := Script( RequestHeader )
        else if Requested( 'GET Version SHIORI/2.0' ) then Scr := MakeResponce( rrOK        )
        else if Requested( 'GET Status SHIORI/2.0'  ) then Scr := MakeResponce( rrNoContent )
        
        else begin
            (* 未対応ヘッダ *)
            DebugfOut( 'NotImplement in Request()' );
            Scr := MakeResponce( rrNoContent );
        end;
        
        if (Scr = '') then Scr := MakeResponce( rrNoContent );

    except
        DebugfOut( 'Error in Request()' );
    end;

    (* リザルトヘッダの作成 *)
    Result := GetGlobalMemory( Scr+TERMINAL, Len );
end;

こんな感じで(^-^;) 駄目駄目じゃん。



NOTIFY で「自分自身」を識別する ID を投げてくれるので、早速内部での DirectSSTP に食わしてみる……これをOwnedSSTP 、と呼ぶらしいです。
導入の結果、いくつかのファンクションで Halt が解消しました。そうか、後回しにされたりすると落ちてたのか……それはそうかもしれん。

あと例のウィンドウハンドルも、結局 Notify から受けてます。なので右クリックメニューの初期化位置も変更……してみたら一部バグ。ゴースト切り替え後にエラーで落ちました。って言うか終了してもエラーの音だけが「ぼかーんぼかーん」(ウチのエラー音)と連発……なんじゃこりゃ(^-^;)
で、デバッグ中にインプリメント不備でログに残っていた OnInitialize イベントで初期化。上手く行ってるように見えましたが…… OnGhostChanged で起動されるとこのイベントは発生しないので、まぁ元の処理と大差ありません(泣)。



ここんところずっと SAORI のプログラミングばっかりしてました。華和梨なんかから呼んで貰えなくて、個人レベルではどーしてどーして大会だったのですが、なんと get version リクエストへのリザルトで「SAORI/1.」とか返してたりなんか……
ヘッダの抽出で1バイトほど取得位置がずれていたためというオチ(笑)

テストとして簡単なところから実装してます。機能としては色々ですんで実際にダウンしてからマニュアル見て……っていうか、根本から書き直すべきか(汗)


ダウンロードする(ki_test.lzh/85KB)


デスクトップアイコンの再配置が上手く走らん……キャプションの取得が出来ればサクっとうまく行くんですが……情報をもう一回、洗いなおしてくるか……。

〝えめる〟へ搭載する(てゆうかして頂く)分のほうは、並べ間違いこそが華なので、簡単なんですけどね……それだって並べ間違い方のエレガンスと言うものを追求せんと行けませんし(謎)



シェルのネットワークアップデートを画策してます。WinInet.dll を使って……てことは当然プラットフォームを選んでしまいます。
まぁしかし今時 Windows95 ユーザーは……切り捨てても構わんでしょう。OS 自体の仕様が、かなりハバチョですからね……。最低限度 NT4.0 ぐらいからだと思います。マルチメディアと言うか、DirectX を使うんだったら Windows98 以降ですかね。



Operation〝雛〟こと GhostPractice-One とは別に、マルチ SHIORI ディスパッチャである GhostPractice-Two 通称「紲」も試験中。

しかしながら、内部で呼び出した SHIORI から得たメモリハンドルを返してもエラー爆発。初期化のミスとかで、端末の SHIORI がコケるんだったら解るんですが……
よくよく思い出してみると、PIRO をフックしようとしたときも同じような現象で悩んだんだよな……。

うまく行けば、リクエストヘッダ毎、さらに細分化してイベント毎に使用する SHIORI を設定できるはず……なんですが。しっかし、何で駄目?



と、関連のトピックスを色々と混ぜましたが。

最新の 0.3.13.102 をアップロードしておきました。……Jade Network の方は手持ちの FTP クライアントが全然繋がってくれないので、当面見合わせ……。このままだと、アカウントを放棄するしかないかも(汗)
なので、公開ページは塾長の借りてるサーバを一部借用……ライセンス違反だろーなー。容量 100MB って言ってたけど本当かな?(笑)


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