2017年2月17日金曜日

ScriptControlでVBScriptのカプセル化

グローバル領域に影響しない形でVBScriptが利用できることが分かったので、VBScriptでしか利用できない機能をまとめてみました。

※昨日の「JScriptからデストラクタを利用する」もこれで利用できるようにしようとしましたが、ScriptControllを使用した場合はVBScriptとJScriptを跨ぐとClass_Terminateが実行されませんでした。。。


ソースは以下
<job>
<script>
vbs=function(){
var sc=new ActiveXObject('ScriptControl')
sc.Language = 'VBScript'
sc.AddCode((function(){/*
F GetTypeName(obj) : GetTypeName = TypeName(obj): EF
F vbMsgBox(str, buttons, title) : vbMsgBox = msgbox(str, buttons, title): EF
F vbInputBox(str, title, default) : vbInputBox = inputbox(str, title, default): EF
F getAdminMembers(pcName)
Dim objGroup, objUser, str
set objGroup = GetObject("WinNT://" & pcName & "/Administrators")
str = ""
For Each objUser in objGroup.Members
str = str & objUser.Name & vbLf
Next
getAdminMembers = str
EF
Class TerminaterClass
Public funTer
Private Sub Class_Terminate: funTer: End Sub
Public Sub setF(f): set funTer=f: End Sub
End Class
F getTerminater
Set getTerminater = New TerminaterClass
EF
Sub a(f)
dim b
set b = New TerminaterClass
b.C(f)
msgbox 1111
End Sub
*/}+'').split('/*')[1].split('*/')[0].replace(/(\s)EF(\s)/g,'$1End F$2').replace(/(\s)F(\s)/g,'$1Function$2'))
return {
sc:sc,
msgbox:function(prompt, buttons, title){
// [buttons]
// 0:OK、 1:OK・キャンセル、 2:中止・再試行・無視、 3:はい・いいえ・キャンセル、 4:はい・いいえ、 5:再試行・キャンセル
// 0x10:警告メッセージアイコン, 0x20:問い合わせメッセージアイコン、0x30:注意メッセージアイコン、 0x40:情報メッセージアイコン
// 0:第1ボタンを標準ボタン、 0x100:第2ボタンを、 0x200:第3ボタン、 0x300:第4
sc.Run('vbMsgBox', prompt, buttons, title)
},
inputbox:function(prompt, title, def){return sc.Run('vbInputBox', prompt, title, def)},
getAdminNames:function(PC名){var arr=sc.Run('getAdminMembers', PC名).split('\n'); arr.pop(); return arr},
setTerminate:function(fun){
var obj=sc.Run('getTerminater')
obj.setF(fun)
return obj
}
}
}()
var excel=new ActiveXObject('Excel.Application'), bk=excel.Workbooks.Add(), fun=function(){WScript.Echo(789);excel.Quit()}
excel.Visible = true
var obj=vbs.setTerminate(fun)
obj.funTer()
vbs.msgbox(vbs.getAdminNames((new ActiveXObject('WScript.Network')).computerName))
vbs.msgbox(vbs.inputbox(111, 'hoge'))
</script>
</job>



何か他にもVBScriptでなければ…!と思っていたことがあったような気がしますが、思い出せないので思い出したら追記します。
それにしてもデストラクタの挙動が意味不明。。

0 件のコメント:

コメントを投稿