2017年2月16日木曜日

グローバル領域を汚さずにvbscriptを併用する

scriptタグを2つ用意して、それぞれのlanguageをvbscript、jscriptとするやり方だと相互にアクセスするものはグローバル領域に宣言しなければいけない…と思っていましたが、ScriptControlというコンポーネントを利用すれば、グローバル領域を綺麗に保ったままにできるようです。

ソースは以下


<job>
<script language=VBScript>
Sub vbMsgbox(msg) : msgbox(msg) : End Sub
a = 1
</script>
<script language=JScript>
WScript.Echo(a)
vbMsgbox(2)
// 以下はエラーになる「オブジェクトでサポートされていないプロパティまたはメソッドです」
// WScript.Echo(vbMsgbox)
vbMsgbox(function(a,b){ return a+b })
vbs=function(){
var sc=new ActiveXObject('ScriptControl')
sc.Language = 'VBScript'
sc.AddCode('Function GetTypeName(obj) : GetTypeName = TypeName(obj) : End Function')
sc.AddCode('Sub vbMsgBox(str) : msgbox(str) : End Sub')
sc.AddCode('b = 3')
sc.AddCode('Sub vbMsgBoxB() : msgbox(b) : End Sub')
return {
sc:sc,
GetTypeName:function(obj){ return sc.Run('GetTypeName', obj) },
msgbox:function(str){sc.Run('msgbox', str)},
vbmb:function(str){sc.Run('vbMsgbox', str)},
vbMB:function(str){sc.Run('vbMsgBox', str)},
vbMB_b:function(str){sc.Run('vbMsgBoxB')}
}
}()
// 表示内容「ScriptControl」
WScript.Echo(vbs.GetTypeName(vbs.sc))
// 以下はエラーになる→msgboxメソッド内で「オブジェクトでサポートされていないプロパティまたはメソッドです」
// vbs.msgbox(123)
// 以下もエラーになる→vbmbメソッド内で「オブジェクトでサポートされていないプロパティまたはメソッドです」
// vbs.vbmb(123)
vbs.vbMB(123)
// 表示内容「IXMLHTTPRequest」
WScript.Echo(vbs.GetTypeName(new ActiveXObject("Microsoft.XMLHTTP")))
// http://dara-j.asablo.jp/blog/2007/05/08/1494362
// 以下はエラーになる「'b'は宣言されていません。」
// WScript.Echo(b)
// 表示内容「3」
vbs.vbMB_b()
// 以下はエラーになる「この変数に割り当てられません。」
// vbMsgbox = 'aaa'
</script>
</job>

0 件のコメント:

コメントを投稿