TObjectto Doublemadnessシリーズのもうひとつ。
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;
なぜこのように機能するのですか?
実際の製品コードでは決して使用されるべきではない、ある種の「スタック上のメモリ」の奇妙さと関係がありますか?