それを,メソッドのアドレスを取り出さずに実行するとしたらTestObject.Proc()となります。
ところが,その例ではProcPtrにはTestObject.に相当する部分がありません。
だから,TestのProcの中でAAへの代入はきちんとしたオブジェクトで無いところへの代入になるのでアクセス違反というわけです。
ちなみにAddressOf (TestObject.Proc)はあくまでクラスTestのProcのアドレスが得られるだけで,TestObjectは何にも活用されません。
ABの関数へのポインタは関数へのポインタであって,C#などのデリゲートのようなものではないのです。
(C#の関数へのポインタの代替であるデリゲートでは,そのような書き方で問題ないようになっているのです)
せいぜいやれることと言えばこのように普通の関数を間に挟むくらいです。
(普通の関数を挟む理由はそれだけでなく,呼び出し規約が微妙に異なっているからということもあります)
コード:
Sub Test_Proc_Thunk(ByRef test As Test)
test.Proc()
End Sub
Dim TestObject As Test
Dim ProcPtr As *Sub(ByRef test As Test)
ProcPtr = AddressOf (Test_Proc_Thunk)
ProcPtr(TestObject)
ProcPtrにTestObjectという引数を渡すのが嫌なら,ProcPtrとそれに渡すべき引数を構造体などでひとまとめにするのが関の山です。
私もどうにかしてほしいとは思いますが,先にどうにかしてほしいことは既に十分ありますし,
大変面倒くさいこと以外,この手に欠点は見られない(と思っている)ので今のところ私は仕方ないかと思っています。
#この手段は,COMクラスの定義をしたとき(OLEドラッグアンドドロップ)で散々やりました。
<独り言>
私は,D言語のように関数へのポインタとデリゲートが共存しているのがよいと思います。
それに関数へのポインタからデリゲートへの変換があれば完璧だと思うのですが。
もっともD言語を使っても居ないのにこんなことを語る資格があるかどうかと言われれば返しようが無いですが。
</独り言>