• 教程-Supports判断接口(Instance)是否支持


     1 function TCommandEnabledController.GetCommandVisible(const ACommandName: string): Boolean;
     2 var
     3   I: Integer;
     4   //定义接口接收者
     5   oCommandVisibleExecutor: ICommandVisibleExecutor;
     6 begin
     7   Result := True;
     8   for I := 0 to FExecutors.Count - 1 do
     9   begin
    10     //判断接口是否支持
    11     if Supports(FExecutors[I], ICommandVisibleExecutor, oCommandVisibleExecutor) then
    12     begin
    13       //使用接口接收者
    14       if not oCommandVisibleExecutor.CommandVisible(ACommandName) then
    15       begin
    16         Result := False;
    17         Break;
    18       end;
    19     end;
    20   end;
    21 end;

    delphi中的函数Supports位于SysUtils单元

    定义如下:

    1 { Interface support routines }
    2 
    3 function Supports(const Instance: IInterface; const IID: TGUID; out Intf): Boolean; overload;
    4 function Supports(const Instance: TObject; const IID: TGUID; out Intf): Boolean; overload;
    5 function Supports(const Instance: IInterface; const IID: TGUID): Boolean; overload;
    6 function Supports(const Instance: TObject; const IID: TGUID): Boolean; overload;
    7 function Supports(const AClass: TClass; const IID: TGUID): Boolean; overload;

    实现如下

     1 { Interface support routines }
     2 
     3 function Supports(const Instance: IInterface; const IID: TGUID; out Intf): Boolean;
     4 begin
     5   Result := (Instance <> nil) and (Instance.QueryInterface(IID, Intf) = 0);
     6 end;
     7 
     8 function Supports(const Instance: TObject; const IID: TGUID; out Intf): Boolean;
     9 var
    10   LUnknown: IUnknown;
    11 begin
    12   Result := (Instance <> nil) and
    13             ((Instance.GetInterface(IUnknown, LUnknown) and Supports(LUnknown, IID, Intf)) or
    14              Instance.GetInterface(IID, Intf));
    15 end;
    16 
    17 function Supports(const Instance: IInterface; const IID: TGUID): Boolean;
    18 var
    19   Temp: IInterface;
    20 begin
    21   Result := Supports(Instance, IID, Temp);
    22 end;
    23 
    24 function Supports(const Instance: TObject; const IID: TGUID): Boolean;
    25 var
    26   Temp: IInterface;
    27 begin
    28   Result := Supports(Instance, IID, Temp);
    29 end;
    30 
    31 function Supports(const AClass: TClass; const IID: TGUID): Boolean;
    32 begin
    33   Result := AClass.GetInterfaceEntry(IID) <> nil;
    34 end;
  • 相关阅读:
    Mac下发布Unity3d中Android平台下出现“android (invokation failed)”的错误
    图片切换特过渡效果
    文件下载
    ASP.NET前台绑定后台变量方法总结
    C# aspx 数据绑定集中 Bind Eval DataBinder.Eval
    MVC 3 Excel文件下载
    ASP.NET中Get和Post的用法 Request.QueryString,Request.Form,Request.Params的区别
    删除掉前一天文件夹里面的文件
    友情链接
    博客园管理记录
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/4772929.html
Copyright © 2020-2023  润新知