Pointers FreePascal:从Double->;对象->;双倍有效,但双倍无效';T

Pointers FreePascal:从Double->;对象->;双倍有效,但双倍无效';T,pointers,casting,integer,pascal,Pointers,Casting,Integer,Pascal,另一个是从TObject到Doublemadness SetPixel需要一个Double作为其第一个参数(即指向IBlittable的指针)。 GetWindowByHWND返回一个Double 这不起作用(segfault): 但这确实: 下面是GetWindowByHWND方法: function GetWindowByHWND(Handle: Double): Double; STDCall; var ReturnVal: IBlittable; begin ReturnVal

另一个是从
TObject
Double
madness

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

这不起作用(segfault):

但这确实:

下面是GetWindowByHWND方法:

function GetWindowByHWND(Handle: Double): Double; STDCall;
var
  ReturnVal: IBlittable;
begin
  ReturnVal := TWindow.Create(Floor(Handle));
  GetWindowByHWND := Double(Integer(ReturnVal));
end;
为什么它是这样工作的


它是否与某种“堆栈上的内存”奇怪有关,而这种奇怪不应该在实际的生产代码中使用?

鉴于您根本不考虑接口引用计数,IBlittable引用可能会阻止接口被释放


您不能简单地随机开始转换接口,而不造成引用计数混乱。

您建议的解决方案是什么?使用普通类,或者更好地研究接口的工作方式。然后特别是它们的重新计数方面。
var
  B: IBlittable;
begin
  B := IBlittable(Floor(GetWindowByHWND(0)));
  while (true) do SetPixel(Double(Integer(B)), 3, 3, $FFFFFF);
end.
function GetWindowByHWND(Handle: Double): Double; STDCall;
var
  ReturnVal: IBlittable;
begin
  ReturnVal := TWindow.Create(Floor(Handle));
  GetWindowByHWND := Double(Integer(ReturnVal));
end;