TObject
到Double
疯狂系列中的另一个。
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;
为什么它会像这样工作?
它是否与某些“堆栈中的内存”奇怪有关,这些奇怪的东西永远不应该用在实际的生产代码中?
答案 0 :(得分:0)
由于您根本不考虑接口引用计数,因此IBlittable引用可能会使接口无法取消分配。
你不能简单地随意开始编译接口,而不会使refcounts搞乱。