XREA.COM Logo XREA.COM Ad

管理人の雑記

33管理人 ★:2007/03/15(木) 00:17:58
COMオブジェクトを扱うモジュール

COMとActiveXってどう違うんだよ!?畜生!!
そんな感じで憎たらしいあれをAutoHotkeyから使用できるようにする関数群を作ることに。
DllCallでそこら辺のAPI呼び出してやれば大抵のことは出来るんだから、別にいちいちCOMに任せなくてもいいような気はするが。

検索したらCOMをC などで呼び出すラッパーの例がいくつか出てきた。
http://www.sol.dti.ne.jp/~yoshinor/ni/ni0003.html
http://www.hcn.zaq.ne.jp/no-ji/reseach/990905.htm
これらを参考に作ることにする。
IDispatchとかVARIANTとかBSTRとかDISPPARAMSとか、色々と構造体が出てくるのでやっかいだ。
C では「dispParams.cArgs=numArgs」で済むところも、AutoHotkeyでは構造体のメンバ配置を調べて先頭からのオフセットで指定してやらないとならない。

IDispatchでは、Invokeメソッド(vtableの6番目の関数)を経由して全ての操作を行う。
引数や返り値は、VARIANT型構造体というものに格納する。
VARIANT型構造体には、格納している値の型情報と値の実体がセットで格納される。
VT_BSTRとかVT_BOOLとか30種類近くもある。
これらを判別・変換する機能を付けなきゃならんのかと気が遠くなりかけたが、すばらしいことにInvoke内で適当に変換してくれるらしいので、全てVT_BSTRで送りつければいい。AutoHotkeyの変数も全部文字列なので、BSTRへの変換は簡単だ。
更に、VariantChangeTypeExというAPIを使えば、返り値の数値や日付時刻値も文字列に変換してくれる。
そんなわけで、AutoHotkeyの変数とVARIANT型構造体の変換関数は意外と簡単に作成できた。

問題は、変数とVARIANTの変換をいつ行うかである。
VARIANT型構造体にするのは関数内のみにして、モジュール利用者はVARIANT型構造体の存在を意識せずに使えるようにしようかと思ったが、しょっちゅう変換を行うのは無駄すぎる気がする。
また、提供関数の引数や戻り値をVARIANT型構造体にすれば、省略された引数がデフォルト値の0になることを利用して簡単に引数の数を関数内で調べられるし、関数が失敗したときに0を返すと言ったことも可能になる。
そんなわけで、利用者側もVARIANT型構造体を意識する必要がある作りにしたが、VARIANTの解放処理を呼び出す必要があったりして面倒くさい。
解放処理を自動で行う機能などをどうにかして付けたいところだ。

とりあえず、オブジェクトを生成してプロパティの取得・設定やメソッド呼び出しが動作するようになった。
エラー処理などは未実装。存在しないメソッドを呼ぼうとしたときなどは、きっと変な動作になる。

以下のような感じで使う

CoInitialize()
o:=CreateObject("Sleipnir.API")
var:=gp(o,"AddressBarString")
MsgBox,% s(var)
vf(var)
kw:=v("検索ワード")
sp(o,"SearchBarString",kw)
vf(kw)
msg:=v("AutoHotkeyから操作しています")
sp(o,"OutputVisible",V_TRUE)
vf(ivk(o,"OutputAddString",msg))
vf(msg)
Release(o)
CoUninitialize()

投稿ファイル名: ActiveX.zip
http://lukewarm.s101.xrea.com/bbs/file/1146398137_33.zip
サイズ: 3529 bytes
101KB
名前: E-mail:
ファイル:
0ch BBS 2005-10-08