• 教程-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;
  • 相关阅读:
    10、驱动中的阻塞与非阻塞IO
    8、Linux设备驱动的并发控制
    入职一个月考核学习
    5、映射的思考
    6、udev机制
    7、字符设备系统
    linux 内存管理之kmalloc、vmalloc、malloc、get_gree_pages的区别
    嵌入式笔试题(linux基础)
    驱动总结
    系统移植总结
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/4772929.html
Copyright © 2020-2023  润新知