科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道[韩小明]JCL中由接口获得对象的方法

[韩小明]JCL中由接口获得对象的方法

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

JCL中由接口获得对象的方法,非常强大,非常精巧。

作者:韩小明 来源:CSDN 2007年10月10日

关键字: 韩小明 JCL 接口 对象

  • 评论
  • 分享微博
  • 分享邮件

我原本并不想单独发以下JCL的方法,可是想到很多人可能还是不知道的。另外,从我博客的回复上看,很多人也愿意去了解一下,特此贴出JCL中的代码。

//=== Interface information ==================================================

function GetImplementorOfInterface(
const I: IInterface): TObject;
{ TODO -cDOC : Original code by Hallvard Vassbotn }
{ TODO -cTesting : Check the implemetation for any further version of compiler }
const
  AddByte 
= $04244483// opcode for ADD DWORD PTR [ESP+4], Shortint
  AddLong = $04244481// opcode for ADD DWORD PTR [ESP+4], Longint
type
  PAdjustSelfThunk 
= ^TAdjustSelfThunk;
  TAdjustSelfThunk 
= packed record
    
case AddInstruction: Longint of
      AddByte: (AdjustmentByte: ShortInt);
      AddLong: (AdjustmentLong: Longint);
  end;
  PInterfaceMT 
= ^TInterfaceMT;
  TInterfaceMT 
= packed record
    QueryInterfaceThunk: PAdjustSelfThunk;
  end;
  TInterfaceRef 
= ^PInterfaceMT;
var
  QueryInterfaceThunk: PAdjustSelfThunk;
begin
  
try
    Result :
= Pointer(I);
    
if Assigned(Result) then
    begin
      QueryInterfaceThunk :
= TInterfaceRef(I)^.QueryInterfaceThunk;
      
case QueryInterfaceThunk.AddInstruction of
        AddByte:
          Inc(PChar(Result), QueryInterfaceThunk.AdjustmentByte);
        AddLong:
          Inc(PChar(Result), QueryInterfaceThunk.AdjustmentLong);
      
else
        Result :
= nil;
      end;
    end;
  except
    Result :
= nil;
  end;
end;

注释:这段代码出自JCL代码中JclSysUtils单元中。

提示:读这段代码,要明白一个道理,在代码执行过程中,接口和对象指针的偏移是硬编码的在汇编中的。转换的过程,就是解析这段汇编的过程。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1610610

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章