科技行者

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

知识库

知识库 安全导航

至顶网软件频道[韩小明]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

    • 评论
    • 分享微博
    • 分享邮件
    閭欢璁㈤槄

    濡傛灉鎮ㄩ潪甯歌揩鍒囩殑鎯充簡瑙T棰嗗煙鏈€鏂颁骇鍝佷笌鎶€鏈俊鎭紝閭d箞璁㈤槄鑷抽《缃戞妧鏈偖浠跺皢鏄偍鐨勬渶浣抽€斿緞涔嬩竴銆�

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