«前の日記(2005-12-22) 最新 次の日記(2005-12-26)» 編集

netail.net

自作フリーソフトや,ゲームに関する雑記を公開してます.
日記はソフトウェア工学の論文ネタが中心です.

最近のお知らせ (古いものはこちら)


2005-12-25 [長年日記]

_ Windows でのマウスのホイール操作のフック

Volume Deskbar 用に導入する気はないけど,いちおう調べてしまったので,まとめ.

フックを仕掛けるときは,SetWindowsHookEx 関数を使う.

// フック: 4番目のパラメータの値は,仕掛けたいスレッドによって適宜変更
// HInstance は,DLL への参照をあらわす変数
MouseHookHandle := SetWindowsHookEx(WH_MOUSE, 
                                    MouseHookProc, 
                                    HInstance, 0); 
// ここで,MouseHookProc の型は,次のとおり.
function MouseHookProc(code: Integer; wparam: 
                       WPARAM; lparam: LPARAM): LRESULT;

lparam の中身は,PMouseHookStruct(MOUSEHOOKSTRUCT へのポインタ)なのだが,ホイールマウス用の拡張メンバが付いたMouseHookStructEx へのポインタとして扱うと,後ろにある mouseData へのアクセスが可能になる.

// 構造体やらの定義
// Delphi 7 では, windows ユニットには定義が存在しないので
// 自前で定義が必要
PMouseHookStructEx = ^TMouseHookStructEx;
tagMOUSEHOOKSTRUCTEX = packed record
  MouseHookStruct: TMouseHookStruct;
  mouseData: DWord;
end;
TMouseHookStructEx = tagMOUSEHOOKSTRUCTEX;
// 参照方法の例
// メッセージが WM_MOUSEWHEEL のとき,
// mouseData の上位16ビットが,ホイールのスクロール量.
function MouseHookProc(code: Integer; 
                       wparam: WPARAM; lparam: LPARAM): LRESULT;
var
    mouse: PMouseHookStructEx;
    delta: Word;
begin
    if (code >= 0) and (wParam = WM_MOUSEWHEEL) then begin
        mouse := PMouseHookStructEx(lParam);
        delta := HiWord(mouse.mouseData);
        // delta の Word 型は符号なし16ビットなので,
        // 符号ありに変換してから使用する
         :

_ [論文]メソッドの呼び出し順序についての制約記述

Tran, N., Abramson, D. and Mingins, C.: Call-Ordering Constraints.

Proceedings of APSEC 2005, pp.291-298, Taipei, Taiwan, December 2005.

Design by Contract の一環として,特定クラスのメソッドの呼び出し順序,それらのメソッドが「必ず呼び出すメソッド」「呼び出すことはないメソッド」(プロトコル)を指定しよう,という提案.基本的には,メソッド呼び出しが状態遷移を表す非決定性オートマトンで定義される.

Behavioral Subtyping として,「親クラスで valid な呼び出し順序は,子でも valid である(子で失敗するなら親でも失敗する)」という条件を指定している.また,必ず呼び出すメソッド,呼び出すことはないメソッドについては,減らすことはできないが,増加することは許している.多重継承のときは,すべての親のプロトコルを満たす必要がある.

必ず呼び出すメソッド・禁止のメソッドについては,メソッド呼び出しごとにスタックに積み上げていき,新しいメソッド呼び出しが「呼び出すリスト」に該当しているなら,リストから(もう呼び出されたので)削除し,禁止メソッドに該当しているときは,違反としてプログラムを停止する.

実装は CLI 上で行なっている様子だが,手法としてはわりと素直な印象がある.

_ [論文] 起こりうるメソッド呼び出し列からの影響波及解析

L. Badri, M. Badri, and D. St-Yves: Supporting Predictive Change Impact Analysis: A Control Call Graphs Based Technique.

Proceedings of APSEC 2005.

単純なコールグラフで,呼び出し関係を追跡すると,順番の考慮がないのでほとんどのメソッドが「影響を受ける」判定になってしまうので,制御フローグラフ上で,メソッド呼び出し頂点だけを残した「Control Call Graph」を使うことを提案した論文.

記法として,繰り返し,選択,省略可能を {m1}, (m1/m2), [m1] と書くことでメソッドの呼び出し列を表現していた.あくまで静的アプローチだが,動的解析からこのような列を見つけられるなら動的な影響波及解析も可能だろう,と言っていた.

_ [論文] APIなどの発見

S. Sarkar, A. Kak, and N. Nagaraja: Metrics for Analyzing Module Interactions in Large Software Systems.

concept-driven modularization として,やたら外部から呼ばれてるメソッドなんかは API の候補だろう,といった当たりをつけるためのメトリクスの提案.

人間の分類とメトリクスの傾向とに類似性があった,ということで,自動的な分類に役立つかもしれない.

お名前:
E-mail:
右の画像に書かれている文字列を入力してください:
コメント: