0

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;

なぜこのように機能するのですか?

実際の製品コードでは決して使用されるべきではない、ある種の「スタック上のメモリ」の奇妙さと関係がありますか?

4

1 に答える 1

0

インターフェイスの参照カウントをまったく考慮していないという事実を考えると、おそらく IBlittable 参照により、インターフェイスの割り当てが解除されないようになっています。

refcounts を台無しにすることなく、単純にインターフェイスのキャストをランダムに開始することはできません。

于 2013-06-12T15:25:09.763 に答える