首页 > 其他分享 >delphi 判断类是否实现接口,获取类实现的接口

delphi 判断类是否实现接口,获取类实现的接口

时间:2024-03-09 19:00:33浏览次数:26  
标签:function const 实现 delphi 接口 IID ICeShi Supports

判断类是否实现接口,获取类实现的接口

代码

type
  ICeShi = interface
    ['{37CABB9D-CAA2-4589-A0C8-5AA1424E525B}']
    function ToPrint: string;
  end;

 TCeShi = class(TInterfacedObject, ICeShi)
    function ToPrint: string;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  vT: TCeShi;
  vI: ICeShi;
begin
  vT := TCeShi.Create;
  if Supports(vT, ICeShi, vI) then
  begin
    Memo1.Lines.Add(vT.ToString + '支持ICeShi接口');
    Memo1.Lines.Add('接口ICeShi的ToPrint方法 ' + vI.ToPrint);
  end;

  if vT.QueryInterface(ICeShi, vI) = S_OK then
  begin
    Memo1.Lines.Add(vT.ToString + '支持ICeShi接口');
    Memo1.Lines.Add('接口ICeShi的ToPrint方法 ' + vI.ToPrint);
  end;
end;

方法

System.SysUtils.Supports

function Supports(const Instance: IInterface; const IID: TGUID; out Intf): Boolean;
function Supports(const Instance: TObject; const IID: TGUID; out Intf): Boolean;
function Supports(const Instance: IInterface; const IID: TGUID): Boolean;
function Supports(const Instance: TObject; const IID: TGUID): Boolean;
function Supports(const AClass: TClass; const IID: TGUID): Boolean;

unit

System.SysUtils

确定给定的对象或接口是否支持指定接口。如果支持该接口,则将接口作为 Intf 参数返回,并返回 True。如果不支持,则返回 False

参数

Instance 指定的对象或接口

AClass 指定的类

IID 接口标识

Intf 如果支持该接口时,返回的接口。

与直接调用 QueryInterface 不同,Supports 允许传递 nil 值作为实例。

除了重载Supports(TClass, TGUID)检查 TClass 是否实现接口之外,其他重载版本的 Supports 都会从一个对象或另一个接口引用中提取接口引用,从而导致基础对象的引用计数增加,然后在退出时释放接口(减少引用计数)。对于引用计数为零的对象,这将导致对象销毁。

var 
  Obj: TInterfacedObject;
begin
  Obj := TInterfacedObject.Create;
  if Supports(Obj, IInterface) then { ... 此时Obj将被释放 }
end;

System.TInterfacedObject.QueryInterface

function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;

unit

System

如果对象支持请求的接口,则将接口作为 Obj 参数返回,并返回 S_OK。如果不支持,则返回 E_NOINTERFACE

参数

IID 接口标识

Obj 如果支持该接口时,返回的接口。

如果成功返回接口指针,它会自动增加引用计数。

参考

GUID And Interface Support Routines

标签:function,const,实现,delphi,接口,IID,ICeShi,Supports
From: https://www.cnblogs.com/txgh/p/18063157

相关文章

  • Linux/macOS 查看网络接口
    Linux$nmclidevicestatusDEVICETYPESTATECONNECTIONenp0s5ethernetconnectedWiredconnection1docker0bridgeconnected(externally)docker0loloopbackunmanaged......
  • 扇区级别访问是指直接读取或写入硬盘上的单个扇区,而不是按文件或目录进行访问。下面是
    扇区级别访问是指直接读取或写入硬盘上的单个扇区,而不是按文件或目录进行访问。下面是扇区级别访问的技术实现原理:硬盘控制器:硬盘控制器是负责管理硬盘读写操作的组件。它负责接收来自主机的指令,并将其转换为硬盘可以理解的命令。硬盘控制器通过与硬盘上的磁头和扇区进行交......
  • delphi xe 好用的日志框架
    菜单:Project-->Options-->SearchPath引入地址如:E:\Software\DelphiLib\loggerpro_1_3_1interfaceusesLoggerPro,Winapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,......
  • Python基于TCP实现聊天功能
    Server端importsocketimportqueueimportthreadingimporttimeserversocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)host=socket.gethostname()print("服务器IP:"+socket.gethostbyname(host))serversocket.bind((host,9090))serversock......
  • python+pytest接口自动化之测试函数、测试类/测试方法的封装
    前言今天呢,笔者想和大家聊聊python+pytest接口自动化中将代码进行封装,只有将测试代码进行封装,才能被测试框架识别执行。例如单个接口的请求代码如下:importrequestsheaders={"user-agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,l......
  • Qt 使用第三方libmodbus库实现Modbus通讯
    之前发表的Modbus通讯程序使用了QT自带的Modbus库,由于QT自带库的数据响应使用的是信号和槽来实现的,所以在一些读写频率较高的场景下,会引发很多异常问题,此篇文章使用C语言写的第三方Modbus库来实现modbus通讯。 经程序运行测试,调用该库进行modbus通讯完虐QT自带mosbus库。......
  • Delphi11安装Android安卓SDK
    由于Google的AndroidSDK不再允许其他程序分发。Delphi11安装后,默认是没有Android安卓SDK的,在默认安装路径的情况下,在C:\Users\Public\Documents\Embarcadero\Studio\22.0\CatalogRepository\AndroidSDK-2525-22.0.46141.0937\目录下面,只有最基本的安卓SDK的命令行工具,我们可以使......
  • 淘宝订单AP I淘宝订单数据接口 获取商品订单列表 获取商品订单详情
    淘宝订单API是淘宝开放平台提供的一组接口,允许开发者获取淘宝或天猫的订单数据,包括订单列表和订单详情。要使用这些API,你需要遵循一定的步骤来获取并接入这些接口。以下是获取淘宝订单数据的基本步骤:注册并创建应用首先,你需要在淘宝开放平台注册账号,并创建一个应用。创建应用......
  • ubuntu c语言 opencv实现h265 编码
    在Ubuntu上使用C语言和OpenCV实现H.265编码,你可以遵循以下步骤:安装依赖:首先确保你的系统已经安装了Ubuntu最新版本,并更新所有包列表。安装FFmpeg,因为OpenCV使用FFmpeg来处理视频编码。可以使用以下命令安装:复制sudoaptupdatesudoaptinstallffmpeg安装OpenCV:OpenCV库本......
  • C++ Qt开发:QNetworkInterface网络接口组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QNetworkInterface组件实现查询详细的网络接口参数。在Qt网络编程中,QNetworkInterface是......