0

疯狂系列TObject中的另一个。Double

SetPixel需要 aDouble作为其第一个参数(即指向 a 的指针IBlittable)。 GetWindowByHWND返回一个Double

不起作用(段错误):

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 引用可能会阻止接口被释放。

您不能简单地开始随机转换接口而不会弄乱引用计数。

于 2013-06-12T15:25:09.763 回答