VB6で関数ポインタっぽいもの

MSDNのコード見てたら面白いコードがあったのでメモっとく

API関数呼び出すときとか、そのコールバック関数のアドレスをAddressOf演算子つかってAPI関数に渡したりできるが、VBのコードではそういうことができない。
VB6でも関数ポインタっぽいものが使えたらなーとか思ってて、今日ぜんぜん関数ポインタじゃないけど、それに近い使い方ができそうなコードをMSDNで見つけた。

以下のようなクラスを作る(Procedureクラス)

Private method As String
Private is_instatiated As Boolean


Private Sub Class_Initialize()
    is_instatiated = False
End Sub


Public Sub setProcedure(obj_ As Object, method_ As String)
    Set obj = obj_
    method = method_
    is_instatiated = True
End Sub


Public Function invoke()
    If is_instatiated Then
        invoke = CallByName(obj, method, VbMethod)
    End If
End Function

ユーティリティとして以下のようなグローバル関数作っとく(クラスProcedureのクラスメソッド的なもの)

public function newProcedure(obj as object, method as string) as Procedure
  set newProcedure = new Procedure
  newProcedure.setMethod obj, method
end function


たとえば、以下のようなクラス(ClassA)があるとする。

public sub hoge()
  MsgBox "hoge"
end sub

public sub fuga()
  MsgBox "fuga"
end sub

public sub moge()
  MsbBox "moge"
end sub

これを

public sub test()
  set obj = new ClassA
  procs = Array( newProcedure(obj, "hoge"), _
                 newProcedure(obj, "fuga"), _
                 newProcedure(obj, "moge"))

  for i = 0 to 2
    procs(i).invoke
  next
end sub

という感じでつかえたりする。
#あまりいい例がかけない ... orz