FreePascal:从Double转换对象 - >对象 - > Double可以,但Double不会

时间:2013-06-12 02:55:40

标签: pointers casting integer pascal

TObjectDouble疯狂系列中的另一个。

SetPixel需要Double作为其第一个参数(即指向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;

为什么它会像这样工作?

它是否与某些“堆栈中的内存”奇怪有关,这些奇怪的东西永远不应该用在实际的生产代码中?

1 个答案:

答案 0 :(得分:0)

由于您根本不考虑接口引用计数,因此IBlittable引用可能会使接口无法取消分配。

你不能简单地随意开始编译接口,而不会使refcounts搞乱。