如何将未知接口保存到指针? [英] How to save an unknown Interface to a Pointer?

查看:146
本文介绍了如何将未知接口保存到指针?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



例如,我有一个未知界面,并希望将其保存到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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆