2007-11-28
COMのイベント (1)
COM, ActiveX, JScript, WSH | |
まずは最初に参考サイトから。
参考サイト
- 株式会社エス・スリー・フォー » COMからのイベントを捕まえる方法
- VCでActiveXコンポーネント(COMも含む)のイベントを扱う
- jscriptで自作COMからイベントを発生させたい
- iriyak:JScript:メソッド名が予約語と衝突
- no title
- Dr. GUI と COM イベント:第 2 部 (ちょっと古いけど)
TLI.TLIApplicationのInvoke系メソッド
var tliapp = new ActiveXObject("TLI.TLIApplication"); var fso = new ActiveXObject("Scripting.FileSystemObject"); var invokeId = tliapp.InvokeID(fso, "FileExists"); WScript.Echo(invokeId.toString(16));
こんなんでDISPIDが取れるみたい。これはDISPIDの取得だけだが、任意のメソッドコールを呼び出し方の指定をして行う事も可能。
var INVOKE_FUNC = 1; var invokeId = 0x2720; var ret = tliapp.InvokeHook(fso, invokeId, INVOKE_FUNC, "C:\\A.TXT");
IDispatch::Invoke()のwrapperみたいになってるみたいです。
これ結構突っ込んだ事まで出来そうな気がする。
COM Eventのメモ
mshtmlとかMicrosoft.XMLHttpRequestだっけ、とかとか。
JSから使われる前提の場合は、良くご存知の通りhandlerを参照で渡す事が可能で、
req.onreadystatechange = function(evt) {}
みたいな事が出来るんだけど、一般的なCOMオブジェクトはWSHからはこういう書き方は出来ない。
WScript.ConnectObject()しないとダメ。
このカラクリって、COMオブジェクト側で
- handlerを持っておくアクセサ
- handlerを呼び出すイベント関数
がどうも同名で定義されてるように思える。(OLE Viewer見る限りは)
参考リンクのjscriptで自作COMからイベントを発生させたいの話の流れを読む限りは、同名じゃないけどJScriptから渡されたFunctionオブジェクトとそれを呼び出すイベント関数の両方が定義されてるのが分かる。
2007-10-23
覚えておくと便利なActiveXコントロール集
あとは自分のこのブログでの検索。
随時追加する。
- ScriptX.Factory
- 本来プリンタ云々の為に使うらしいけどEventSinkでキモいCOMイベントに対してハンドラを追加出来るようになる。(Download: Home page - ScriptX)
- ScriptControl
- 任意のスクリプトエンジンを動的に組み込む為のコントロール
- MSWinsock.Winsock
- ネットワーク系コントロールとしては最も低レベルなコントロール。大概これでネットワークスクリプトは書ける
- TLI.TLIApplication
- TypeLibをinspectするコントロール。素敵。恐らくVisual Studioが入って無いと存在しない。
- Shell.Application
- Windowsの簡易操作、Explorer/Internet Explorerの管理など
- Scripting.FileSystemObject
- FileSystemを扱うコントロール
- WbemScripting.SWbemLocator
- WMIを扱うコントロール、schema指定もあるけどどう違うか分からない。そのうち詳細に。
- InternetExplorer.Application
- IEの画面そのもの。メニューバーとかコンテキストメニューとかは含まない。端的に言えばWebControl
- Scriptlet.TypeLib
- TypeLibの生成、GUIDの生成、DHTML Behavior Componentの何か。*1
- htmlfile
- JSで言うならdocumentオブジェクト相当。IEのレンダリング部。IHTMLDocumentインターフェースかな。
- Scripting.Dictionary
- Hash的な使い方が出来る。
- ADODB.Stream
- IStreamを実装したコンポーネント。バイナリ処理する時も必要。
TODO
- MSXML系
- ADODB系
- htmlfile
mshtml
他なんかあったかな。忘れた。
*1:Behaviorの方は多分知らなくて良いw
2007-10-17うーむ
TLI.TLIApplication (2)
WSH, COM, JavaScript, JScript, TypeLib | |
もうすぐ寝るけど、ちょっとやっちゃったから少しだけ。
明日追記する。
定数の列挙
TypeLibにひもづく定数はWSFの<reference>要素でGlobalオブジェクトにまるっとコピーされるんだけども、大規模なWSHを使ったアプリを作る場合はどうしても不向き。
と言う訳でやっぱり定数の列挙したいなーと。
TypeLib Information Library*1に注目してる一番大きな要因が定数なんですよね。
手順としては、
- InterfaceInfo.Parent (TypeLibInfoインターフェースを実装したオブジェクト)
- TypeLibInfo.Constants (Constantsインターフェースを実装したオブジェクト)
- Constants.Count (Enumの数)
- Constants.Item(i) (ConstantInfoインターフェースを実装したオブジェクト、定数グループを表す)
- ConstantInfo.Count (定数の数)
- ConstantInfo.Item(i) (Constant)
- Constant.Members.Count (Memberの数)
- Constant.Members.Item(i) (MemberInfoインターフェースを実装したオブジェクト)
- MemberInfo.Name (定数名)
- MemberInfo.Value (定数値)
- TypeLibInfo.Constants (Constantsインターフェースを実装したオブジェクト)
って感じで取れる
WScript.Echo(iinfo.Parent.Constants.Item(1).Members.Item(1).Name); // tliErrNoCurrentTypelib WScript.Echo(iinfo.Parent.Constants.Item(1).Members.Item(1).Value); // -2147220991
MemberInfoは今回は定数を表現してたけど、それがメソッドだったり色々する訳です。
TLI.TLIApplication (1)
WSH, COM, JavaScript, JScript, TypeLib | |
これはシリーズ連載予定。
ちなみにTLI.TLIApplicationは今だとVisual Studio ExpressionVisual Studio 2005 Express Edition*2をインストールすると入ってる。
追記1 (2007-10-19T14:35:13+09:00)
えーと、Visual Studio 2005 Express Editionのことだと思われ、 Expression Studio (Design/Blend/...)は別の製品で、ちょと恥ずかしくて まぎらわしい間違いなので、訂正した方がよいかもです...。
OutlookとOutlook Expressの関係と同じと考えると忘れにくいかもしれませ ん...。
と同僚のkaorunさんから突っ込まれたので直しました。
間違いを突っ込まれたら素直に直すのが最近の良い子の例です。(w
kaorunさん、ありがとうございました。
オブジェクトのインターフェースの実装状況を調べる
var ctrl = WScript.CreateObject("ScriptControl"); ctrl.Language = "VBScript"; ctrl.AddCode("Function xTypeName(x): xTypeName = TypeName(x): End Function"); var TypeName = function(x) { return ctrl.Run("xTypeName", x); }; var tliapp = WScript.CreateObject("TLI.TLIApplication"); WScript.Echo(TypeName(tliapp)); // TLIApplication var iinfo = tliapp.InterfaceInfoFromObject(tliapp); WScript.Echo(TypeName(iinfo)); // InterfaceInfo WScript.Echo(iinfo.Name); // _TLIApplication WScript.Echo(iinfo.GUID); // {8B21775D-717D-11CE-AB5B-D41203C10000} WScript.Echo(iinfo.ImpliedInterfaces.Count); // 1 つまり直接implementsしてるinterfaceが1個 // iinfo.ImpliedInterfaces.Item(1)は再びInterfaceInfoが返って来る。 WScript.Echo(iinfo.ImpliedInterfaces.Item(1).Name); // IDispatch WScript.Echo(iinfo.ImpliedInterfaces.Item(1).ImpliedInterfaces.Count); // 1 まぁ当たり前 WScript.Echo(iinfo.ImpliedInterfaces.Item(1).ImpliedInterfaces.Item(1).Name); // IUnknown
と言う訳で、
- InterfaceInfo.Name
- InterfaceInfo.ImpliedInterfaces.Count() > 0
- InterfaceInfo.ImpliedInterfaces.Item(i) [1 <= i <= Count]
を再帰的にやれば良い。
って事で特定のInterfaceを実装しているかどうかは、次のようなコードで問題ない。
var tliapp = WScript.CreateObject("TLI.TLIApplication"); function isImplemented(obj, iface) { try { // WScript.Echo("TypeName: " + TypeName(obj)); var iinfo = tliapp.InterfaceInfoFromObject(obj); } catch (e) { // リテラルとかを突っ込むとエラー発生 return false; } return (function (iinfo, iface) { // WScript.Echo("iinfo: " + iinfo.Name + ", iface: " + iface); if (iinfo.Name == iface) { return true; } if (iinfo.ImpliedInterfaces.Count > 0) { var i; var cnt = iinfo.ImpliedInterfaces.Count; for (i = 1; i <= cnt; i++) { if (arguments.callee(iinfo.ImpliedInterfaces.Item(i), iface)) { return true; } } return false; } else { return false; } })(iinfo, iface); }
VBScriptのTypeNameの結果とInterface名 (追記1: 2007-10-18T03:26:22+09:00)
概ね同じような値が返って来る。さっきのisImplementedのデバッグ出力のコメントアウト部分を外して、IUnknownと色々比較してみる。
Object
isImplemented({}, "IUnknown"); // TypeName: JScriptTypeInfo // iinfo: JScriptTypeInfo, iface: IUnknown // iinfo: IDispatch, iface: IUnknown // iinfo: IUnknown, iface: IUnknown
TLI.TLIApplication
isImplemented(tliapp, "IUnknown"); // TypeName: TLIApplication // iinfo: _TLIApplication, iface: IUnknown // iinfo: IDispatch, iface: IUnknown // iinfo: IUnknown, iface: IUnknown
ScriptControl
var ctrl = WScript.CreateObject("ScriptControl"); isImplemented(ctrl, "IUnknown"); // TypeName: ScriptControl // iinfo: IScriptControl, iface: IUnknown // iinfo: IDispatch, iface: IUnknown // iinfo: IUnknown, iface: IUnknown
Scripting.FileSystemObject
var fso = new ActiveXObject("Scripting.FileSystemObject"); isImplemented(fso, "IUnknown"); // TypeName: FileSystemObject // iinfo: IFileSystem3, iface: IUnknown // iinfo: IDispatch, iface: IUnknown // iinfo: IUnknown, iface: IUnknow
なるほどねぇ。
作ったオブジェクトが含まれるTypeLibをOLEViewから探す時 (追記2: 2007-10-18T03:43:02+09:00)
InterfaceInfo.Parent.HelpStringがOLEViewのTypeLibの見出しと大体一致してるみたい。
function getTypeLibName(progID) { return tliapp.InterfaceInfoFromObject(new ActiveXObject(progID)).Parent.HelpString; }
のようにしておいて、
getTypeLibName("InternetExplorer.Application"); // Microsoft Internet Controls getTypeLibName("MSXML"); // Microsoft XML, v3.0 getTypeLibName("ScriptControl"); // Microsoft Script Control 1.0 getTypeLibName("Scripting.FileSystemObject"); // Microsoft Scripting Runtime getTypeLibName("TLI.TLIApplication"); // TypeLib Information getTypeLibName("MSWinsock.Winsock"); Microsoft Winsock Control 6.0 (SP6)
まぁ、ActiveXObject作っちゃうのがアレげですけどw
2007-10-16おぎわら遊技場
ライブラリ化構想
WSH, JScript, JavaScript | |
mozIJSSubScriptLoader的な物
var loader = WScript.CreateObject("WSH.SubScriptLoader"); loader.load("http://foo.com/bar.js", this);
だとthisに対してwithしてスクリプトの読みこみ。URIの解決はmshtmlじゃないと多分出来ない。
ローカルファイルならScripting.FileSystemObjectで、リモートならXHRで解決する。
Observer
まぁある方がいいよね。
Registry系
特にCOM系のCLSID, interface, TypeLib, ProgIDの列挙用。
但し既にレジストリのシーケンシャルアクセスが早く無いのがわかっているので、元はレジストリでもキャッシュする仕組みがあるのがベター。
ネットワーク系
SFCminiかな。WinSock叩く感じ。でもTypeLibで定義されてるActiveXで解決出来る事もある気がする。
VBScriptのラッパーとか、evalとか
ScriptControlで解決する。
IE系
InternetExplorer.Applicationは補助的になる。
Shell.Applicationベースが一番汎用的。TypeName(VBScript)が非常に有用。
COM系のキモいイベントモデルのラッパー
WScript.ConnectObjectだっけな。ここら辺とObserver系のライブラリで上手い事出来る気がする。
TypeLib操作系
TLI.TLIApplication(vstlbinf.dll or tlbinf32.dll)で。
定数の扱いも<reference />よりこっちのがすっきりだと個人的には思う。
DB操作系
SQLiteが色んな意味で最も有力。ADODBで。
ORMapper的なのが欲しいけど、そもそもADODB自体の練習必要。
これくらいあると相当便利になると思うんだよなぁ。
と言うかやる。
ludozher
bet365 –; Forms & Stats.
Bet365 have teamed up with Bet Radar to offer comprehensive form and statistics for Football and other major sports. Bet365 also provide full form, statistics and results for UK horseracing and is one of the few online bookmakers to provide US horseracing and sports statistics.
bet365 –; Odds & Markets. <a href=http://ludozher.info/bet365-casino-poker-e-do-desporto-aposta-revisao-do-site-como-fazer-o-login-e-obtenha-um-bonus-codigo-promocional-link.php>http://ludozher.info/bet365-casino-poker-e-do-desporto-aposta-revisao-do-site-como-fazer-o-login-e-obtenha-um-bonus-codigo-promocional-link.php</a> 20 (1/5) or more.
It didn’t mean we had to bet £100 all in one go, so we just placed several £2, £5 and £10 bets until we’d bet at least £100. It was surprisingly quick to do, although you need to make sure that these bets are placed after you’ve entered the offer code, and the qualifying bets need to settle within 30 days of entering the code. So bear that in mind if you’re thinking of placing ante-post bets and other bets that are far into the future. <a href=http://ludozher.info/bet365>http://ludozher.info/bet365</a> see the link
私の場合は、ECMAScript(JavaScript,JScript)のコードをライブラリ化してまとめてインクルードでき、かつ多段(プロトタイプ)継承とプライベートメンバ・メソッドな「クラス(ユーザー定義オブジェクト)」を作る。
また、ライブラリ化の方針としては、ECMAScript準拠の部分と環境依存部分を別"クラス"や別"パッケージ"または"サブクラス"に分けて、なるだけ様々な環境で動作できるようにしています。
WSHでもそれらは動くのですが、せっかくスクリプト言語なのでCUIの対話形式での実行環境を作ってみましたのです。
(似てるのかな…?)スミマセン今はとりあえず返信させて頂こうかと思いましたので、後々内容を読ませていただきますね。
> ライブラリ化してまとめてインクルードでき
この辺りは僕はScriptControlでやろうと思っています。
ただScriptControlはまだ挙動がいまいちわかってない部分があるんですよねぇ。
> かつ多段(プロトタイプ)継承
これはちょっとこの言葉だけだと想像出来ないかも。。。
僕も対話形式のConsoleは作ってるんですけど、まだライブラリ化の方針まで固まってません。ScriptXは使おうと思ってますけど。
後々参考にさせていただくかも知れません。
>> かつ多段(プロトタイプ)継承
JAVAなんかはクラスベースの継承だけれど、ECMAScriptはプロトタイプベースの継承ですよね。ただ、関数を使ったユーザー定義オブジェクトの場合、継承のシステムはユーザーが用意しなければならないはずです。
私の場合は、クラスライクな継承を何段も(サブクラスのサブクラスのサブクラスの…)できるようにしたのでこのように書かせていただきました。ただし、やはり多重継承はできませんでした。その代わり、"クラス"に1つ(static)なプロパティも継承させることにしました。
こっそり、こんなことやってます。
どこだろ、、、OleViewとかですかね?w
http://del.icio.us/zigorou でその手のブクマが流れてると思います。
で、継承云々の話ですけど、そもそも継承を積極的に使うべきかって辺りでJavaScriptのprototypeベースはそこまで要らない気がするんですよねぇ。
基本は普通にprototypeにベースとなる"オブジェクト"を突っ込んであげるだけで事足りると僕は考えていて、それ以上に拡張したいならmixinすればいいと考えてます。
型チェックってよりメソッド名で実装してるかしてないかみたいな。
そう仰って頂けるのは恐縮です><
<a href=http://stewedtomatoes.top/how-to-can-stewed-tomatoes-at-home>how to can stewed tomatoes</a>
Bitcoin unique. Ela nao ligado com as atividades dos bancos, nao tem fisico aparencia, e inicialmente, projecao desregulada e descentralizada.
Se simples palavras, o que e o bitcoin e digital dinheiro, que sao extraidas em computacao dispositivos e giram no proprio sistema de seu leis.
<a href=http://bitcoinpor.top/como-encontrar-um-tesouro-com-um-bom-retorno/>retornos bitcoin</a>
http://cougar.wants.sexblog.pw