JScriptからは、スクリプト終了時にClass_Terminateを自動実行させることが限界のようです。
色々試して悪あがきして上記の結論に至ったソースは以下。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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 件のコメント:
コメントを投稿