如何将未知接口保存到指针? [英] How to save an unknown Interface to a Pointer?
本文介绍了如何将未知接口保存到指针?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
例如,我有一个未知界面,并希望将其保存到TreeNode Data?
var
X:Inknown;
要保存:
....
Node:= TreeView1.Items.Add;
//Node.data:=x; //编译器不会允许这个
Node.data:=@x;
...
获取:
...
var
//X:=Node.data; //编译器也不会允许这个
指针(X):= Node.data; //一个异常捕获
...
解决方案
一个接口是一个指针,所以你可以按原样存储它(不要使用 @
运算符)。然而,为了确保接口的使用寿命,只要节点引用它,就必须手动递增/递减其引用计数,例如:
Node:= TreeView1.Items.Add;
Node.Data:=指针(x);
x._AddRef;
x:= IUnknown(Node.Data);
procedure TMyForm.TreeView1Deletion(Sender:TObject; Node:TTreeNode);
begin
IUnknown(Node.Data)._ Release;
结束
Can I save an unknown interface to a pointer ?
For example I have an unknown interface and want to save it to a TreeNode Data?
var
X : Inknown;
To save :
....
Node:=TreeView1.Items.Add;
//Node.data:=x; //compiler won't allow this
Node.data:=@x;
...
To get :
...
var
//X:=Node.data; //compiler won't allow this too
Pointer(X):=Node.data; //an exception caught
...
解决方案
An interface is a pointer, so you can store it as-is (don't use the @
operator). However, to ensure the interface's lifetime, you have to increment/decrement its reference count manually for as long as the node refers to it, eg:
Node := TreeView1.Items.Add;
Node.Data := Pointer(x);
x._AddRef;
x := IUnknown(Node.Data);
procedure TMyForm.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
IUnknown(Node.Data)._Release;
end;
这篇关于如何将未知接口保存到指针?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文