DelphiのVMT (Virtual Method Table)

について、解説を頂けました。
0
Ktz @ktz_alias

Delphiムズいー >< https://t.co/q347WhLq1X 個数の後の6byteと各メソッド名の間の6byteの意味が分からないー

2013-06-21 15:29:56
Owl's perspective @owlsperspective

@ktz_alias 8バイトアライメントになってる、ってことでは?

2013-06-21 15:51:26
Ktz @ktz_alias

@owlsperspective 最初の6byteはそれっぽいですね。しかし名称間の6byteは別の理由のような気が・・・

2013-06-21 15:53:22
Owl's perspective @owlsperspective

@ktz_alias VMTはどこが詳しかったんだっけな…クイックリファレンスだっけ?ちょっと見てみよう

2013-06-21 15:57:56
Owl's perspective @owlsperspective

@ktz_alias あー違うなー。6はエントリごとの TMethod = packed record Size: Word; Address: Pointer; Name: packed ShortString; ... end; の先頭2要素(続く

2013-06-21 16:07:54
Owl's perspective @owlsperspective

@ktz_alias Size(2バイト)、Address(4バイト)をスキップするためのもの、だけど、 https://t.co/6dSu4SYG5g のコードって動くのかな?

2013-06-21 16:09:30
Owl's perspective @owlsperspective

@ktz_alias 手元のDelphiクイックリファレンス ISBN4-87311-040-8 の3章実行時型情報の3.2.1にある擬似コードとテーブル構造が違うと思うんだよね。

2013-06-21 16:10:38
Owl's perspective @owlsperspective

@ktz_alias この本が絶版状態というのは非常に悔やまれる。eBookで復刻していただけないものか。

2013-06-21 16:11:34
Ktz @ktz_alias

@owlsperspective ワケあってDelphi3を相手にしているので、今のバージョンでは動かないかも・・・

2013-06-21 16:12:37
Ktz @ktz_alias

@owlsperspective 引っこ抜いてきた元がDelphi7用のdunitなので、ある程度は耐えれるかもしれないけど・・・

2013-06-21 16:13:49
Owl's perspective @owlsperspective

@ktz_alias Delphi 3ならたぶんクイックリファレンスの話がそのまま使えるので、先頭2バイトのサイズを見ながら4バイトスキップして次にあるNUL終端文字列を取って、次の要素(先頭のサイズが1つのレコードのサイズ)に進む、とすればいいと思います

2013-06-21 16:15:42
Owl's perspective @owlsperspective

@ktz_alias さっきのTMethod構造体は...のところにエクストラメンバーがいるので、Sizeメンバでポインタを進めていく必要がある、と書かれています。

2013-06-21 16:17:05
Ktz @ktz_alias

@owlsperspective なるほど、解説ありがとうございます。

2013-06-21 16:19:14