|
■No46128 (とっちゃん さん) に返信 > ■No46124 (たくボン さん) に返信 > >>System.Windows.Forms.Control.GetParentFont > が、やっぱりないですね。こんな程度の参照の仕方じゃ甘いのかな? > あんまり詳しくないからこれ以上さっくり調べる方法知らないんですよね。。。
調べる方法は、色々あるけど俺もちゃんと勉強してるわけでもないし、そのやり方で合ってるのかもわからないけど。 やってること自体はそんな難しくないから誰でもできます(俺でもできてるくらいなんだし)
> ってことで、とりあえずこのメソッドが何ものかくらいは教えてもらえませんか? > たくボンさんは、私よりずっと知識があるようですし、わからないから質問したんだし。。。
言語はVB、.NETのバージョンは。AnyCPUターゲットでコンパイルしてx86で動作。 細かい動作は確認してもらえばいいので、要点のみ。 検証のコードは、フォームにLabel1を貼り付けて(この時点でアンビエントプロパティ)、Form_Loadに
Me.Label1.Font.Dispose() Me.Label1.Font = Nothing
と書いただけの簡単なもの。 これでデバッグした時のアセンブリで話を進めます。
まず、 Me.Label1.Font = Nothing は、
0000004d mov ecx,dword ptr [ebp-3Ch] 00000050 mov eax,dword ptr [ecx] 00000052 call dword ptr [eax+000005FCh] 00000058 mov dword ptr [ebp-4Ch],eax 0000005b mov ecx,dword ptr [ebp-4Ch] 0000005e xor edx,edx 00000060 mov eax,dword ptr [ecx] 00000062 call dword ptr [eax+0000010Ch] 00000068 nop
0x52のcallでGCFONT.Form1.get_Label1の参照を引っ張ってきて、0x62でこいつのSystem.Windows.Forms.Control.set_Fontを呼んでますよね。 get_Label1の中はそんな複雑じゃないので割愛。気になったのはこのset_Fontする時の動作。
0000004a call FFFDD100 して、
System.Windows.Forms.PropertySto re.GetObject んで、0x32から System.Windows.Forms.PropertySt ore.LocateObjectEntry に入って、反復と比較を繰り返しながら何かを返却してますよね?
その直後に、
00000037 test eax,eax 00000039 je 000000C0
と来て、その直後、 0000004f mov esi,eax 00000051 test esi,esi 00000053 je 00000070
と続いて、無条件に0x70
System.Windows.Forms.PropertyS tore.GetObject 前回と同じで、0x32のcallから System.Windows.Forms.PropertySt ore.LocateObjectEntry と続いてもう一度PropertySto reからオブジェクトを拾ってきてる。
それからだらだらとレジスタの操作が続いて、0x68のcallで問題のSystem.Windows.Forms.Control.GetParentFont。
この時点でのレジスタは EAX = 00000000 EBX = 00000000 ECX = 0136EFD0 EDX = 0000001C ESI = 00000000 EDI = 0136EFD0 EIP = 7B1C9BE0 ESP = 041AE3C8 EBP = 041AE3D8 EFL = 00000246
こんな感じ。
この中で 00000010 test eax,eax 00000012 jne 00000019
の後、0x19に飛んで、
0x1dのinternal属性と、CanAccessPropertyの処理が終わって
0000002d test eax,eax 0000002f je 00000014
となって、一番知りたい
00000014 xor eax,eax 00000016 pop esi 00000017 pop ebp 00000018 ret
で戻り値返却。
んじゃ、一体GetParentFontが返却するのは何なのか?ってとこが知りたかったんです。 ここまでが■4606の書き込み。
PropertySto re.GetObjectで何を2回拾ってきてて、GetParentFontが何を返してるのか。
この辺りの動作がわかれば、もっとワクワクできると思ったので、詳しいなちゃさんとjittaさんに質問したんですけどねぇ・・・。 まだまだお二人の足元にも及ばなかったようです。
> 以下独り言... > アセンブラの世界でオブジェクトと言ったら、普通は、.obj ファイルを指すし。。。 > いまどきのPC向けマクロアセンブラなら構造体とかあるけどそれはオブジェクトとは言わないしなぁ。。。
ここはすいませんでした。 PropertySto re.GetObjectを通るのはわかってると思ったのでオブジェクトって書いてました。
> esi は呼び出し前に持ってた値って書いてるからそれが何か?は呼び出し元がわからない以上 > 誰にもわからないとしか言いようがないしなぁ。。。言葉が足りなかったのかなぁ? > やっぱりGetParentFontが何者かがわからないとこれ以上は何が聞きたいのかわからない気がするなぁ。。。
俺もアセンブリは詳しい方ではないし、全部独学なので用語とか間違っていたら指摘してください(頭悪いので、あまり多くの単語を覚えるのは苦手なんです)
明日から新案件で2日ほど博多に出張するので、出先では書き込みできないかもしれませんが有益な情報や面白い情報とかあれば教えてください。
Sto reはまた空白入れてます。
|