COMWinLibってなんやねん2007年06月03日 17時52分17秒

経緯

Google Gearsをインストールしたら、IE向けにはDLLが1個入るだけみたいだった。これ多分COMだろうな、と思ってVBAでオブジェクトブラウザを立ち上げてみたら、やっぱり「GearsTypelib」とやらができているので、COMでなんかできるっぽい。

で、ライブラリ探してるときに「Earth 1.0.Type Library」とかいろいろと興味深いものがちらほらと見つかったのだが、そのなかの1つに「COMWin 1.0.Type Library」てのがあった。

ライブラリの場所を見たところ、Microsoft Script Debuggerについてきてるやつみたいだ。(昔インストールしていた)

見てみよう

さっそくオブジェクトブラウザで開いてみると、「COMWindow」ってオブジェクトがあり、これが「CreateWindowEx」だの、「FindWindowEx」だの、ActiveXにあるまじき名前のメソッドが実装されてるっぽい。なんじゃこりゃーー。

newしてみる

ともかく、

var cw = new ActiveXObject("COMWinLib.COMWindow");
としてみると、「オートメーション サーバーはオブジェクトを作成できません」。 はて、したらこれでどうだ。
var cw = new ActiveXObject("COMWindow");
おお、エラーでないよ。これでいいんか。

ほんじゃまず引数取らないやつから試すか。

var w = cw.GetDesktopWindow();
「オブジェクトでサポートされていないプロパティまたはメソッドです」だそうだ。はて?

VBS経由して型を調べてみたら、COMWindowではなくIWindowDispになっていた。ほんじゃそっちのメソッドを試してみよう。

cw.IsWindow(); // → false
cw.IsWindowEnabled(); // → false
cw.IsWindowVisible(); // → false
ぜんぜんだめじゃん。お、「GetParent()」なんてのがある。
var p = cw.GetParent(); // → pもIWindowDisp

p.IsWindow(); // → false
p.IsWindowEnabled(); // → false
p.IsWindowVisible(); // → false
なんじゃそれ。

情報がほしい...

まぁ、メソッドの定義とか見てると、引数の中に

uType AS <サポートされていないバリアント型>
とかorzな記述があったりで、WSHからシンプルに使えるライブラリじゃなさそうなんだけど、「COMWinLib」とか「comwin.dll」とか見てもほとんど情報が見つからないのでものすごく気になってる。

追記:「サポートされないバリアント型」はIWindowDisp#MessageBoxにあったんだが、VC#2005でtlbimpしてみたらuintとかでマーシャリングされてたのでふつーにNumber渡して問題なかった。

だれかなんか情報しらないかなー

オブジェクトブラウザ代わり2007年06月03日 19時15分14秒

オブジェクトブラウザって便利だけど

WSHなんかでCOMを扱うとき、OfficeかVB6をインストールしてるなら、オブジェクトブラウザが役に立つ。VC++があるならOLE Viewerもいいだろう。

でもこれらのツールは無償ではないので、VB6なりVC++なりもっていない場合はどうするかっていうお話。いくつか探してみた。

COM Explorer

COM Explorer - Explore, Manage and Repair ActiveX Controls, DLL & EXE Servers

シングルライセンス $150の商用ソフト。VBA/VB6のオブジェクトブラウザよりは多分高機能。30days trialがあるみたい。

Simple OLE Browser

Win32OLE の製作過程よりDL可能

Ruby製のツール。Rubyインストールしてあるならこれでよいかと。動作もさくさくしてるし。

tlbimp/aximp

.NET Framework SDKをインストールするといっしょに入るコマンドラインユーティリティ。COMオブジェクトの.NETラッパーアセンブリを生成してくれる。使い方はSDKドキュメントを参照。

で、生成したアセンブリをVSのプロジェクトで参照するなりReflectorに喰わせるなりすればOK。

が、これはCOMのインターフェイスを提供してるDLL/EXEを知らないと使えないのであまりおすすめではないか。

VB/VC# 2005 Express Edition

たぶんこれ最強。なんかてきとーにプロジェクト作って、参照設定でCOMから追加すればOK。VBA/VB6のオブジェクトブラウザよろしく、インストールされているライブラリの一覧から選択して参照を追加するので、ライブラリの名前からあたりつけて必要な機能探したりとかもできる。

もちろん.NETアセンブリが作成されるのでReflector行きもアリ。

tlbimp/aximpで作成してもそうだけど、VBA/VB6のオブジェクトブラウザと違い、クラス/インターフェイスの継承関係も調べられるのでちょっと便利度が高いと思う。