自己管理对象生命周期中Delphi接口的一个问题

Delphi与C++Builder设计时接口开发核心技术解析 Delphi 设计时架构的核心单元之一,封装了与设计器交互所需的关键接口。自定义组件编辑器的核心在于扩展设计时交互能力,其中最直观的表现形式就是右键上下文菜单的增强。通过继承并重写其虚方法,开发者可以轻松为组件添加专属命令项。提供了三个关键方法用于菜单构建:: 返回菜单项总数: 返回第Index个菜单项的显示文本: 用户点击菜单项时执行的动作以下是一个完整示例,展示如何为TForm添加“生成事件骨架”和“清理未使用单元”的快捷命令:typepublic。 阅读详情

Delphi的Interface机制来自于COM,使用了接口的对象,Delphi缺省采用引用计数对生命周期进行管理。

如果不希望Delphi来自动管理对象生命周期,我们可以将包含接口的对象继承自下面的对象(TIntObject)

type
  TIntObject=class(TObject, IUnknown)
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  end;

function TIntObject.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  if GetInterface(IID, Obj) then
    Result := 0
  else
    Result := E_NOINTERFACE;
end;

function TIntObject._AddRef: Integer;
begin
  Result:=1;
end;

function TIntObject._Release: Integer;
begin
  Result:=1;
end;

继承自TIntObject的对象就不会被Delphi的接口机制自动释放了。

使用自己管理生命周期的对象时有些情况也会出现内存访问异常。

例如:

type

  TMyClass1=class(TIntObject, IOneInter

Delphi 7操作Excel的完整实例教程 Delphi 7作为一款经典的开发工具,以其强大的组件库和高效的编译器,受到了众多开发者的青睐。尽管在当今众多现代化IDE中,它可能已显过时,但其基础架构和一些独特的功能,依然在特定的场景下发挥着作用。特别是在与Excel的交互方面,Delphi 7可以轻松实现数据的导入导出、自动化操作等。在介绍如何使用Delphi 7与Excel进行交互之前,本章将首先对Delphi 7做一个基础概述,包括其开发环境的设置以及一些基础知识。 阅读详情

相关推荐

对象的生命周期.pdf

对象的生命周期,这是孙卫琴书中的单独的一章!将的挺不错的!可以参考一下!!

Delphi管理对象生命周期

在本文中,我试图简要回顾一下在Delphi应用程序中管理对象生存期的方法。

第二十章-开发Delphi对象式数据管理功能(五)

第二十章-开发Delphi对象式数据管理功能(五)

Delphi 接口使用中,对象生命周期管理,如何释放需要注意的问题

网上有篇文章《Delphi接口编程的两大陷阱》,里面提到接口的生存期管理问题。但该文章里面提到的两个问题,其实都是对 Delphi 不理解导致的。   先说该篇文章中提到的第一个问题为什么是该文章作者不理解 DELPHI 导致他认为那是不可理解的陷阱。然后俺再来重点解释接口生命周期管理。   一. 接口 - 对象。 假设有接口定义: IMyTask =

zw279462900的专栏 1975

Delphi 面向对象编程 第三章

为什么80%的码农都做不了架构师?>>> ...

weixin_33716557的博客 163

07.Delphi接口生命周期

Delphi接口中,是不需要释放的,调用完之后,接口生命周期就结束了,如下面的例子 unit mtReaper; interface type // 定义一个接口 IBase = interface ['{F3E97960-3F35-11D7-B847-001060806215}'] end; TSun = class(TIn...

weixin_30346033的博客 241

Delphi DLL使用接口和调用的方法

Delphi接口采用引用计数的方法管理对象生命周期,但是DLL中输出的对象可能不是被Delphi调用,其引用计数不一定正确,因此DLL中接口对象的生命周期不由Delphi编译器自动生成的代码管理,而是程序员自己控制,所以上面 的工厂包括构造和解析两个接口对象的生命周期管理方法。 所有接口对象应该集成自下面的接口,而不应该继承自Delphi自带的TInterfacedObject:

xiexuan2007的专栏 4415

接口管理对象生命周期.

为什么用接口老是会AV错误?可能很多人会碰到这样的问题。 有些人干脆抛弃用接口管理对象生命周期。 我想如果搞清楚接口何时会增加和减少计数应该会掌控到接口何时会销毁对象从而解决av根本。 做了一个测试 procedure TForm1.btnAddInterfaceClick(Sender: TObject); var   lvITest: ITest; begin   //+1 ...

weixin_34050519的博客 128

Delphi多线程安全缓存对象(引入计数器管理对象生命周期)

delphi; 对象缓存;自定义缓存;

红枫叶随风的专栏 184

Delphi接口机制——接口操作的编译器实现过程

来源:https://www.cnblogs.com/findumars/p/5008571.html   学习COM编程技术也快有半个月了,这期间看了很多资料和别人的程序源码,也尝试了用delphi、C++、C#编写COM程序,个人感觉Delphi是最好上手的。C++的模版生成的代码太过复杂繁琐,大量使用编译宏替代函数代码,让初学者知其然而不知其所以然;C#封装过度,COM编程注定是要与操作系统...

wsyabcde的专栏 1011

Delphi对象创建与释放

前言:做Delphi很多年了,打算留下了啥,所以准备写博客了。 关于对象的创建和释放,相信大家都非常熟悉了,在这里我打算浅谈一下。 本文中我将对象分为2大类,组件对象和非组件对象,暂时不考虑接口以及实现接口的类。 组件对象,也就是从TComponent继承下来的类对象。其它的就归于非组件对象。各位不要太过纠结,给我举反例。 非组件对象 比如Tlist、TCollection等等,此类对象必...

gang148375的博客 1657

Delphi接口机制——接口操作的编译器实现过程(1)

学习COM编程技术也快有半个月了,这期间看了很多资料和别人的程序源码,也尝试了用delphi、C++、C#编写COM程序,个人感觉Delphi是最好上手的。C++的模版生成的代码太过复杂繁琐,大量使用编译宏替代函数代码,让初学者知其然而不知其所以然;C#封装过度,COM编程注定是要与操作系统频繁打交道的,需要调用大量API函数和使用大量系统预定义的常量与类型(结构体),这些在C#中都需手工声明,不

TU2的专栏 2260

Delphi实现智能指针

 在C++中可以利用栈实现智能指针,可是在Delphi中由于所有的对象都是堆对象,无法利用栈对象。虽然在Delphi2007版本中已经有类似的栈结构,但是仍然不能实现完全意义上的指针。但是Delphi中可以利用另外一样东西实现智能指针--接口。附上源码:unit AutoPtr;interfaceuses  SysUtils, SyncObjs;type

missmecn的专栏 1597

Delphi语言的堆

作为一种高层次的编程语言,Delphi提供了丰富的内存管理机制,其中堆的使用是一个重要的部分。本文将深入探讨Delphi语言中的管理,包括堆的定义、结构、分配与释放,以及如何高效使用堆内存。尽管Delphi提供了强大的内存管理功能,但程序员仍需对堆内存的生命周期进行巧妙的控制。在日常编程实践中,应时刻关注内存的分配与释放,建立起良好的内存管理习惯,这不仅对个人的编程能力有益,更是提升整个项目质量的重要保障。:内存泄漏是堆管理中最常见的问题,指的是分配的内存未被释放,从而导致可用内存逐渐减少。

2501_91009399的博客 509

关于Delphi程序中互相引用的问题

在写代码的时候,我们有时候会在A窗体中用到了B窗体,而B窗体又可能反过来引用A窗体中的对象,此时如果处理不好就会在窗体释放的时候,对象会报内部例外的错误。这时我们可以用另一种方式去处理这种问题: 如果A窗体中用到了B窗体,我们就要尽量不要再去B窗体中反过来引用A的东东。 这时我们可以把B窗体中要用到的对象另外封装成一个类,然后定义一个此类的一个全局变量,然后定义一个创建此对象的函数,这样我们就

疯狂的老鼠 1042
上一篇: Delphi中继承自TFrame或TForm的类,DFM文件修改
hexi
博客等级 码龄27年 4粉丝 2原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值