全局变量 node: Pointer;
...
var
v_node: IXMLNode;
begin
v_node := xmldoc.CreateElement('ToolItem', XCFIndex.TargetNamespace); //创建一个节点,返回一个接口
showmessage(v_node.NodeName); // 取节点名称 node := IXMLNode(v_node); //把节点赋给node指针
showmessage(IXMLNode(node).NodeName); //这里可以正确取出
end;procedure a;
begin
showmessage(IXMLNode(node).NodeName); //此处就会出现地址错误,是什么原因
end;
上面如果用创建一个对象,不会有问题,请大家帮帮忙
...
var
v_node: IXMLNode;
begin
v_node := xmldoc.CreateElement('ToolItem', XCFIndex.TargetNamespace); //创建一个节点,返回一个接口
showmessage(v_node.NodeName); // 取节点名称 node := IXMLNode(v_node); //把节点赋给node指针
showmessage(IXMLNode(node).NodeName); //这里可以正确取出
end;procedure a;
begin
showmessage(IXMLNode(node).NodeName); //此处就会出现地址错误,是什么原因
end;
上面如果用创建一个对象,不会有问题,请大家帮帮忙
应为 node := Pointer(v_node); //把接口的地址赋给一个指针变量
node^是什么都没有, 即node的值是指向v_node的地址,但内存好象也不存在了,很奇怪
但Node指向的东西在出了上面的过程后就已经销毁了(局部变量)在别的过程中当然非法访问了
要不然你就得手工增加引用计数.
var
v_node: IXMLNode;
begin
v_node := xmldoc.CreateElement('ToolItem', XCFIndex.TargetNamespace);
showmessage(v_node.NodeName);
node := IXMLNode(v_node);
IInterface(node)._AddRef;//加上这句,手工增加引用计数.
showmessage(IXMLNode(node).NodeName);
end;