TObject
to Double
madnessシリーズのもうひとつ。
SetPixel
は、最初の引数としてa を必要としDouble
ます (つまり、 a へのポインターIBlittable
です)。
GetWindowByHWND
を返しますDouble
。
これは機能しません(segfault):
var
B: Double;
begin
B := GetWindowByHWND(0);
while (true) do SetPixel(B, 3, 3, $FFFFFF);
end.
しかし、これは行います:
var
B: IBlittable;
begin
B := IBlittable(Floor(GetWindowByHWND(0)));
while (true) do SetPixel(Double(Integer(B)), 3, 3, $FFFFFF);
end.
GetWindowByHWND メソッドは次のとおりです。
function GetWindowByHWND(Handle: Double): Double; STDCall;
var
ReturnVal: IBlittable;
begin
ReturnVal := TWindow.Create(Floor(Handle));
GetWindowByHWND := Double(Integer(ReturnVal));
end;
なぜこのように機能するのですか?
実際の製品コードでは決して使用されるべきではない、ある種の「スタック上のメモリ」の奇妙さと関係がありますか?