まずは引数として渡せる関数の再現
試行錯誤の履歴
・Application.Run() … 名前文字列で指定する 重め
参照引数が使えない
Application ってどうなの
・CallByName() … 名前文字列で指定する 重め
参照引数は使える
オブジェクトのメソッドしか呼べない
・イベント … 汎用的に呼べるイベントを作ってやることで再現 軽め!
戻り値はない エラーを呼び出し元に Raise できない
withEvents のメンバにセットした値を外部に持ち出せば、
対応したイベントを呼び出すことができる
イベントに光を見出して、文字列コードをラムダにして動的モジュールを生成していくようにした。
LINQのオペレータ的なものを、Skip, Take, Select, Where, SelectMany, くらいまで作成した。
しかし for each に対応させられずに、Do Loop で回す感じになっていて、不満があった。
IEnumVariant を V-table ごとメモリ上に構築してしまえばよいことを知る。
APIを使用することをなぜか拒んでいたが、解禁する。つまらないこだわりだったと思う。
VBAのオブジェクトはCOM関係そのものということに気づく。
で、ついでにここでこれに気づいてしまう…
・DispCallFunc() … AddressOf で関数ポインタを得て、使用できる。
参照引数も使用できる。型も使用できる。
が、引数指定のクセが強く、たやすくハングアップする。これは問題。
なやむ。
また、オブジェクトのメソッドを V-table のオフセットで指定実行できる。
そこからVBAのクラスは IDispatch を継承しているということに気づく。
ITypeInfo を作成すればいろいろいじれる。
ただ、本当に DispCallFunc() の引数はセンシティブで、試行錯誤しまくった。情報もないし…。
また、クラスメソッドを呼ぼうとしたときに、第一引数が戻り値になってしまうという謎の現象に遭遇。
回避できない。
同じことで悩んでる外人さんもいた。
どうしたものか
そこで今、このページを発見。
https://msdn.microsoft.com/en-us/library/ms221141(v=vs.85).aspx
うおぅ!!
今までやってた煩雑なことが、APIでできそう???
と興奮すると同時に徒労感が。
いまここ。