(for Internet Explorer)
Dim  LifeHandleClass::p as Object
グループに所属している相互参照しているオブジェクトを参照します。
参考
オブジェクトのメンバー変数やメソッドにアクセスするときは、ハンドルのメンバー変数 p を
介する必要があります。  このように相互参照しているオブジェクトとハンドルのオブジェクトを
分けることで、参照している変数がなくなったことをハンドルで検出できるようにしています。
Sub  LifeHandleClass::Class_Terminate()
ハンドルが参照されなくなったときに、
を呼び出します。
オブジェクトをグループに追加し、ハンドルからオブジェクトを参照できるようにします
オブジェクトをグループに追加して、そのオブジェクトを参照するハンドルを生成します
オブジェクトをグループから除外します
ハンドルから参照されるカウンターを減らし、必要なら相互参照を切ります
Sub  LifeGroupClass::AddHandle( Handle as Object, Object as Object )
オブジェクトをグループに追加し、ハンドルからオブジェクトを参照できるようにします。
【引数】
Handle
(ルートの)ハンドル
ハンドルが参照しようとしているオブジェクト
Object
Function  LifeGroupClass::Add( Object as Object ) as LifeHandleClass
オブジェクトをグループに追加して、そのオブジェクトを参照するハンドルを生成して返します。
【引数】
Object
ハンドルが参照しようとしているオブジェクト
返り値
生成されたハンドル
Sub  LifeGroupClass::Remove( Object as Object )
オブジェクトをグループから除外します。
【引数】
Object
ハンドルが参照しているオブジェクト
Sub  LifeGroupClass::AddTerminated( Object as Object )
ハンドルから参照されるカウンターを減らし、必要なら相互参照を切ります。
【引数】
Object
参照されなくなったハンドルが参照しているオブジェクト
相互参照を切ることで、グループに所属するすべてのオブジェクトが削除されます。
自分(Me)も削除されます。
グループに所属するオブジェクトを参照するハンドルが他にもあるときは、
Object を参照しているハンドルだけが削除され、Object は残ります。
参考
グループのユーザーは、本メソッドを直接呼び出さないでください。
から呼ばれます。
→ T_Dic.vbs
T_DestroyerClass
→ vbslib.vbs
テスト
ソース
相互参照しているオブジェクトを削除するタイミングを制御するオブジェクト。
DestroyerClass のオブジェクトが削除されるときに、相互参照を切るメソッド DestroyReferences
を呼び出し、相互参照していたオブジェクトの Class_Terminate が呼び出されます。
Case1
WScript.echo  "End of Main"
Case2
WScript.echo  "End of Main"
WScript.echo  "もし、ここ以降でデストラクターが動くときは、"+_
    "プログラム終了時にすべてのオブジェクトを削除する"+_
    "ことによるデストラクター呼び出しです。"

Sub  Case1()
    WScript.echo  vbCRLF +"Case1:"
    Set destroyer = new DestroyerClass
    Set a_object = new MutualClass : a_object.Name = "a" : destroyer.Add  a_object
    Set b_object = new MutualClass : b_object.Name = "b" : destroyer.Add  b_object
    Set a_object.Reference = b_object
    Set b_object.Reference = a_object
End Sub

Sub  Case2()
    WScript.echo  vbCRLF +"Case2:"
    Set destroyer = new DestroyerClass
    Set a_object = new MutualClass : a_object.Name = "a"
    Set b_object = new MutualClass : b_object.Name = "b"
    Set a_object.Reference = b_object
    Set b_object.Reference = a_object
End Sub

Class  MutualClass
    Public  Name
    Public  Reference
    Public  IsDestroyer    '// ■追加

    Private Sub  Class_Terminate()
        WScript.echo  Me.Name +".Class_Terminate"
        CheckUnderDestroyer  Me  '// ■追加
    End Sub

    Public Sub  DestroyReferences()  '// ■追加
        Me.Reference = Empty
    End Sub
End Class
サンプル
Destroyer
A
B
相互参照を切る
関数が終了したときにオブジェクトを参照している変数がなくなると、ガーベージコレクターによって
Class_Terminate が呼ばれますが、相互参照していると Class_Terminate は呼ばれません。
プログラム終了時に呼ばれます。 DestroyerClass は、相互参照しているオブジェクトでも
Class_Terminate が呼ばれるようにします。
相互参照するクラスは、相互参照を切る DestroyReferences メソッドと、DestroyerClass に
登録されると True になる IsDestroyer 属性(プロパティ)を実装してください。 下記サンプルの
MutualClass を参照。
参考
→ ガーベージコレクション (GC)
DestroyerClass
Case1:
Case1: a.Class_Terminate
Case1: b.Class_Terminate
Case2:
End of Main
もし、ここ以降でデストラクターが動くときは、プログラム終了時にすべての
オブジェクトを削除することによるデストラクター呼び出しです。
Case2: a.Class_Terminate
Case2: b.Class_Terminate
表示例:
関連
の使用を推奨します。
注意
DestroyerClass の代わりに
Sub  DestroyerClass::Add( Object as variant )
相互参照するオブジェクトを登録します。
【引数】
Object
登録するオブジェクト
本関数は、Object の IsDestroyer 属性(プロパティ)を True に設定します。
DestroyerClass が削除されるタイミングで、Object の DestroyReferences メソッドが
呼ばれます。
Sub  DestroyerClass::Remove( Object as variant )
登録から除外します。
【引数】
Object
除外するオブジェクト
DestroyerClass が削除されるときよりも早く削除するオブジェクトを指定してください。
本関数は、Object の IsDestroyer 属性(プロパティ)を False に設定します。
Sub  CheckUnderDestroyer( Object as variant )
Destroyer によって管理されていなければ、エラーにします。
Sub  DefaultFunction( Argument1 as variant )
何もしないコールバック関数の本体。
【引数】
Argument1
第1引数(無視します)
→ vbslib.vbs
ソース
参考
イベントが発生したらコールバックされる関数の集合。
イベント関数を呼び出すオブジェクトのプロパティに、本クラスのオブジェクトを設定します。
参考
イベントが発生したときにコールバックされる関数を登録します。
コールバックされる関数を登録解除します。
ソース
→ vbslib.vbs
テスト
→ T_Item_vbslib フォルダ
書きかけ
イベントが発生したときに、登録されているコールバック関数を呼び出します。
未対応
Sub  EventResponders::Add( Func as EventFunction, Responder as variant, Priority as integer )
イベントが発生したときにコールバックされる関数を登録します。
【引数】
Func
Responder
コールバックされる関数
イベントに応答するオブジェクト
サンプル
    caller_object.OnEventX.Add  GetRef( "ResponderClass_OnEventX" ), Me, 1000
参考
ソース
→ vbslib.vbs
Priority
優先度
Priority 引数
1000 が標準。
EventResponders のオブジェクトに登録した複数のコールバックのうち、
Priority が小さいものから先にコールバックされます。
Sub  EventFunctionSample( Responder as variant, Caller as variant, Args as variant )
イベント関数。 イベントが発生したらコールバックされる関数の型。
【引数】
Responder
Caller
イベントに応答するオブジェクト
イベントが発生したオブジェクト
Args
イベントのパラメーター(イベントの内容による)
    caller_object.OnEventX.Remove  Me
Sub  EventResponders::Remove( Responder as variant )
コールバックされる関数を登録解除します。
【引数】
Responder
イベントに応答するオブジェクト
サンプル
ソース
→ vbslib.vbs
Sub  EventResponders::Calls( Caller as variant, Args as variant )
イベントが発生したときに使い、登録されているコールバック関数を全て呼び出します。
【引数】
Caller
Args
イベントが発生したオブジェクト
イベントのパラメーター(イベントの内容による)
サンプル:
  Me.OnEventX.Calls  Me, Empty
参考
ソース
→ vbslib.vbs
その他
Class_Initialize でエラーが発生してもエラーが発生しない問題に対応します。
Function  CreateGuid() as string
GUID を生成します。
2D7E3038-E395-460A-86CC-C8AB3C3D5D54
返り値の例:
(src)
グローバル変数 g_TestModeFlags に、F_NotRandom を設定すると、
テスト・プログラム用に 00000000-0000-0000-0000-000000000000 から順番に
+1 された値が返ります。
g_TypeLib = 0 にすると、再び 1 から順番に値を返します。
Function  KeyClass::IsSame( Key as object ) as boolean
Function  KeyClass::SetKey( Key as object ) as object
キーとなるオブジェクトを登録します。 一度しか登録できません。 返り値は、Key です。
以前登録したキーと同じかどうかを判定します。
サンプル:
Dim  g_AppKey

  Dim  AppKey : Set AppKey = new KeyClass ' for Ident only
  Set  g_AppKey = new KeyClass : g_AppKey.SetKey( AppKey )
  If not g_AppKey.IsSame( AppKey ) Then  Err.Raise 1,,"Invalied AppKey"
以前登録した特定のオブジェクトかどうかを判定します。
KeyClass から特定のオブジェクトを取得することはできないので、グローバルスコープに、
KeyClass オブジェクトを置いても、特定のオブジェクトへの参照を複製することから守ります。
参考
関連
ファイル、またはフォルダが同一かどうかを比較します。
ファイルまたはフォルダを削除します。
src から dst にファイルまたはフォルダをコピーします。
フォルダを作成します。
カレントフォルダを移動します。
src から dst にファイルまたはフォルダを移動します。
フォルダまたはファイルが存在するかどうかを返します。
テキストファイルの中で、指定したキーワードを含む行を返します。
指定のテキストを内容とした、テキストファイルを作成します。
ワイルドカードを展開します。 サブ・フォルダーも検索します。
他にもあります。左のツリーから選択してください。
ファイル名を変更します。
相対パスを返します。
書き込み可能なフォルダの設定オブジェクトを生成します。
書き込み可能なフォルダを設定します。
書き込み可能でない場所にライトしたときの動きを設定します。
スクリプトが想定していない場所にライトしたときの警告
テキストファイルの内容を表示します。
コマンドプロンプト準拠関数
vbslib オリジナル関数
圧縮(zip)ファイルを解凍します。
FileSystemObject を参照するグローバル変数です。
参考
テスト
ファイルを操作する主な関数を下に一覧します。
すべての関数は、左のツリーを展開してください。
テキストファイルを開きます。(リード用)
テキストファイルを開きます。(ライト用)
テキストファイルの内容を変更します。
フル・パスを返します。
テンポラリ・フォルダの中のパスを返します。
サブフォルダのオブジェクトを高速に辞書に列挙します。
指定した名前のファイルをライトするときにブレークさせます。
負荷が高いときに発生する書き込み拒否エラーに対処します。
一部がバイナリになっているテキストファイルを作成します。
CSV 形式の1行を解析して、配列に格納します。
XML ファイル、または XML 形式の文字列を読み込みます。
Sub  cd( Path as string )
カレント・フォルダーを変更します。
(src)
存在しないフォルダを指定すると、E_WIN32_FILE_NOT_FOUND エラーになります。
ファイルのパスを指定すると、E_WIN32_DIRECTORY エラーになります。
関連
  cd  "FolderA"
  t = ReadFile( "File.txt" )
テスト
→ T_cd_do.vbs # cd
  cd  g_start_in_path
参考
カレント・フォルダーの中にある FolderA フォルダーに、カレント・フォルダー
を変更します。 File.txt は、FolderA フォルダーにあるファイルになります。
現在のカレント・フォルダーを、プロセス起動時のカレント・フォルダーに
変更します。
main 関数、または main2 関数を呼ばれたときのカレント・フォルダーは、プロセス起動時
のカレント・フォルダーではなく、メイン.vbs ファイルがあるフォルダーになります。
メイン.vbs ファイルがあるフォルダーからの相対パスを指定するときは、cd 関数を呼び
出す必要はありません。 (この仕様は、vbslib4 から)
【引数】
Path
新しいカレント・フォルダーのパス
"FolderA"
サンプル
サンプル
ファイル:
vbslib.vbs
Sub  funcA()
  Dim  ds_:Set ds_= new CurDirStack

  cd  "sub"
End Sub  '// 元のフォルダに戻る
オブジェクトが破棄されるタイミングで、カレント・フォルダーを元に戻すオブジェクトです。
下記の場合、関数 funcA から返ると、CurDirStack オブジェクトのデストラクタで、関数に
入ったときのカレント・フォルダーに戻ります。
関連
(src)
テスト
→ T_cd_do.vbs # CurDirStack
サンプル
ファイル:
vbslib.vbs
Sub  pushd( dir as string )
カレントフォルダを移動します。 ただし、popd で戻れるようにします。
(src)
テスト
→ T_cd_do.vbs # pushd
pushd  "FolderA"
popd  '// 元のフォルダに戻る
サンプル
ファイル:
vbslib.vbs
関連
Sub  popd()
カレントフォルダを pushd する前に戻します。
(src)
テスト
→ T_cd_do.vbs # popd
pushd  "FolderA"
popd  '// 元のフォルダに戻る
サンプル
ファイル:
vbslib.vbs
関連
Sub  cd_UpperCaseDrive()
カレント・フォルダーのドライブの文字を大文字に変更します。
サンプル
cd  "c:\Folder"
cd_UpperCaseDrive
Assert  g_sh.CurrentDirectory = "C:\Folder"
→ vbslib.vbs [cd_UpperCaseDrive]
テスト
→ T_cd_do.vbs # [T_cd_UpperCaseDrive]
ソース
SrcPath のファイルまたはフォルダを、DstFolderPath フォルダーの中にコピーします。
Sub  copy( SrcPath as string, DstFolderPath as string )
copy 関数は、ファイルやフォルダの有無によって動きが変わらないようにするため、コマンド
プロンプトの copy や FileSystemObject の CopyFile 関数と、若干動きが異なります。
しかし、エクスプローラーなどの一般的なファイラーの動きと同じです。
DstFolderPath 引数
SrcPath 引数
a.txt ファイル
動作
C:\dst_folder
a.txt を dst_folder にコピーします
(dst_folderがフォルダのとき)
C:\dst_folder\a.txt
a.txt フォルダーを作成して、その中に a.txt を
コピーします
フォルダ aa を作成して、aa フォルダの中に
aa フォルダをコピーします
C:\dst_folder\aa
フォルダ aa を dst_folder の中にコピーします
C:\dst_folder
aa フォルダー
C:\dst_folder\bb
ワイルドカード
ファイルとフォルダを dst_folder にコピーします
C:\dst_folder
C:\dst_folder\bb
フォルダ bb を作成して、その中へファイルと
フォルダをコピーします。
フォルダ bb を作成して、bb フォルダの中に
aa フォルダをコピーします
【引数】
SrcPath
DstFolderPath
コピー元のファイルパス、またはフォルダーパス
コピー先のフォルダーパス (ファイルパスは不可)
copy  "src", "dst"
copy  "src\*", "dst"
サンプル
src フォルダーの内容を dst フォルダーの中にコピーします
→ vbslib.vbs
エラー
SrcPath に指定したファイルが見つからない
DstFolderPath がロックされているか、ファイルが存在する
src フォルダーを dst フォルダーの中にコピーします
→ T_Copy.vbs # [T_Copy]
テスト
vbslib3 の copy の DstFolderPath に指定したパスがフォルダーではないときは、ファイル名を
変える動きでしたが、vbslib4 の copy では、必ず DstFolderPath の新規フォルダーを作成して、
その中へコピーします。 これは、エクスプローラーなどの一般的なファイラーの動きと同じです。
コピーと同時にファイル名を変える時は、copy_ren を使ってください。
g_Vers("CopyTargetIsFileOrFolder") = 1
vbslib ver3 との違い
参考
関連
参考
ファイル:
vbslib.vbs
src\*
コピー先にファイルがあっても、上書き確認をユーザーに行わずに、上書きします。
ユーザーには、上書きするフォルダーやファイルのバックアップをとるようにガイドしてください。
フォルダーをコピーするとき、SrcPath のフォルダーと DstFolderPath のフォルダーを全く同じ
ファイル構成にしたいときは、DstFolderPath のフォルダーを削除してからコピーしてください。
そうしなければ、DstFolderPath の中にあるファイルと同じ場所にあるファイルが SrcPath の
中にに無くても、そのファイルは無くならないためです。 これは、エクスプローラーなどの一般的
なファイラーの動きと同じです。
Src
FileA.txt
コピー元のフォルダー
コピーする前のコピー先
FileB.txt
Dst
FileA.txt
コピーした後のコピー先
Dst
FileB.txt
vbslib ver3 の copy やコマンドプロンプトの copy と動きが異なる場合があります。(下記)
vbslib3 で作成したスクリプトをそのまま動かすと、DstFolderPath にファイルパスを指定した
copy は、指定したファイル名と同じ名前のフォルダの中にコピーするようになります。 しかし、
そのまま、実行を続けても、開こうとするファイルがフォルダーであるため開けない、というエラー
でブレークするため、大きな問題にはならないでしょう。 また、ファイルには一般に拡張子が
付いているので、vbslib3 で作成した copy を vbslib4 で動かすと、拡張子が付いたフォルダー
が作られます。拡張子が付いたフォルダーがあれば、copy の移植を検討してください。

vbslib3 の仕様に戻したいときは、下記のように設定してから copy を呼び出してください。
仕様を変更した理由は、copy する前の DstFolderPath がフォルダーであるかないかによって、
コピー先が変わらないようにするためです。 (あるかないかを判定する If 文が不要になります)
ソース
→ vbslib_mini.vbs