2017年2月15日水曜日

JScriptからVBScript経由でデストラクタ利用

ただしVBScriptで「obj = Nothing」を実行した瞬間にobjに入っていたものが解放される…という感じのことはJScriptからは無理でした。
JScriptからは、スクリプト終了時にClass_Terminateを自動実行させることが限界のようです。

色々試して悪あがきして上記の結論に至ったソースは以下。


<job>
<script language=VBScript>
Class vbClass
Dim funTer
Private Sub Class_Initialize
End Sub
Private Sub Class_Terminate
funTer
End Sub
Public Sub setTer(fun)
' set Class_Terminate = fun '←はエラーになる。
set funTer = fun
End Sub
End Class
function getVBC(funTer)
set getVBC = New vbClass
getVBC.setTer funTer
end function
Sub vbA
set b = new vbClass
jsSetTer b
set b = Nothing
End Sub
Class vbClass0
Private Sub Class_Terminate
msgbox 123
End Sub
End Class
set f = new vbClass0
msgbox "fの解放前"
set f = Nothing ' VBScript内で完結している←はNothingを入れた時点(「fの解放前」と「fの解放後」のメッセージの間)で解放される。
msgbox "fの解放後"
</script>
<script language=JScript>
jsSetTer = function(obj){
var excel = new ActiveXObject('Excel.Application')
excel.Visible = true
excel.Workbooks.Add().Sheets(1).Cells(1,1).Value = 'JScript vbs'
obj.setTer(function(){excel.Quit()})
}
vbA()
myClass = function(str){
var excel = new ActiveXObject('Excel.Application')
excel.Visible = true
excel.Workbooks.Add().Sheets(1).Cells(1,1).Value = 'JScript '+str
var 後始末 = function(){ excel.Quit() }
var vbObjTerminate = getVBC(function(){ 後始末() })
}
var obj={}
obj.a = new myClass('A')
obj.b = new myClass('B')
c = new myClass('C')
d = new myClass('D')
e = function(){ new myClass('E') }()
delete obj.a
obj.b = null
delete c
d = null
// 上記のいずれの方法でもオブジェクトが解放されないようで、vbClassのClass_Terminateが実行されるのは
// 以下の「終了直前」メッセージを閉じた後。。
// JavaScriptからClass_Terminateを間接的に利用することはできるが、
// VBScriptのように「a = Nothing」の瞬間にオブジェクトを解放させることは出来ないっぽい。
// VBScript側で作成したbもJScript側の関数に一度渡しているせいか、
// Nothingを入れても開放されない。
WScript.Echo('終了直前')
</script>
</job>

JScriptが絡むと解放できないのは仕方がないことっぽい

0 件のコメント:

コメントを投稿