教程-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;

 

posted on 2015-08-31 14:03  疯狂delphi  阅读(789)  评论(0编辑  收藏  举报

导航