【问题标题】:FreePascal: Casting object from Double -> Object -> Double works, but just Double doesn'tFreePascal:从 Double -> Object -> Double 投射对象有效,但 Double 无效
【发布时间】:2013-06-08 01:31:33
【问题描述】:

TObjectDouble 疯狂系列中的另一个。

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

为什么会这样?

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

【问题讨论】:

    标签: pointers casting integer pascal


    【解决方案1】:

    考虑到您根本不考虑接口引用计数这一事实,IBlittable 引用可能会阻止接口被释放。

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

    【讨论】:

    • 您推荐的解决方案是什么?
    • 使用普通类,或者更好地研究接口的工作原理。然后特别是他们的引用方面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    相关资源
    最近更新 更多