constant WIN32OLE::ARGV

ARGV -> [object][permalink][rdoc][edit]

直前のメソッド呼び出しの引数を格納した配列です。

OLEオートメーションでは呼び出し先が引数に対して値を設定できます。しかし、 Rubyのメソッド引数は値のみを取るため、そのままでは呼び出し先が設定した値を参照できません。このような場合、ARGVを参照することで呼び出し先の設定値を参照できます。

以下のリストは、VBで開発したオブジェクトのメソッド呼び出しを例としています。このメソッド(Accm)は、第1引数で指定した演算を第2引数と第3引数に適用し、結果を第2引数に設定します。

' VB (OLE Automation server)
Public Sub Accm(ByVal Operator, ByRef Accumulator, ByVal Operand)
    If Operator = "*" Then
        Accmulator = Accmulator * Operand
    Else If Operator = "+" Then
        Accmulator = Accmulator + Operand
    End If
End Sub

# Ruby
x = 10
obj.Accm '*', x, 11
p x               # => 10 …… 呼び出しによって影響を受けない
p WIN32OLE::ARGV  # => ['*', 110, 11] …… 結果はARGVの対応する引数に反映される
obj.Accm '+', 10, 11
p WIN32OLE::ARGV  # => ['+', 21, 11]

直前のメソッド呼び出しが例外となった場合、ARGVの設定内容は呼び出し前の状態が保たれます。つまり、WIN32OLE自身がARGVの内容を消去するのは、メソッド呼び出しに成功した場合のみです。このため最後のメソッド呼び出しが引数にオブジェクトを返すタイプのメソッドだった場合、GCにオブジェクトを回収させるために、呼び出し側でARGVを消去してください。

' VB (OLE Automation server)
Public Sub GetInterface(ByRef obj)
    Set Obj = New OleObject
End Sub

# Ruby
obj.GetInterface nil   # 引数の数を合わせるためダミー引数を指定
WIN32OLE::ARGV.clear   # 通常は、後続のメソッド呼び出しによって消去される