`
ruilin215
  • 浏览: 1142643 次
  • 性别: Icon_minigender_2
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

JCL中由接口获得对象的方法

CSS 
阅读更多

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

<style type="text/css"> <!-- body { color: #000000; background-color: #ffffff; } .pas1-assembler { background-color: #ffffff; color: #000000; } .pas1-character { background-color: #ffffff; color: #ff00ff; } .pas1-comment { background-color: #ffffff; color: #008000; font-style: italic; } .pas1-float { background-color: #ffffff; color: #ff0000; } .pas1-hexadecimal { background-color: #ffffff; color: #ff0000; } .pas1-identifier { background-color: #ffffff; color: #000000; } .pas1-number { background-color: #ffffff; color: #ff0000; } .pas1-preprocessor { background-color: #ffffff; color: #008000; font-style: italic; } .pas1-reservedword { background-color: #ffffff; color: #000080; font-weight: bold; } .pas1-space { background-color: #ffffff; color: #000000; } .pas1-string { background-color: #ffffff; color: #ff00ff; } .pas1-symbol { background-color: #ffffff; color: #000000; } --></style>

//===Interfaceinformation==================================================

functionGetImplementorOfInterface(
constI:IInterface):TObject;
...{TODO-cDOC:OriginalcodebyHallvardVassbotn}
...{TODO-cTesting:Checktheimplemetationforanyfurtherversionofcompiler}
const
AddByte
=$04244483;//opcodeforADDDWORDPTR[ESP+4],Shortint
AddLong=$04244481;//opcodeforADDDWORDPTR[ESP+4],Longint
type
PAdjustSelfThunk
=^TAdjustSelfThunk;
TAdjustSelfThunk
=packedrecord
caseAddInstruction:Longintof
AddByte:(AdjustmentByte:ShortInt);
AddLong:(AdjustmentLong:Longint);
end;
PInterfaceMT
=^TInterfaceMT;
TInterfaceMT
=packedrecord
QueryInterfaceThunk:PAdjustSelfThunk;
end;
TInterfaceRef
=^PInterfaceMT;
var
QueryInterfaceThunk:PAdjustSelfThunk;
begin
try
Result:
=Pointer(I);
ifAssigned(Result)then
begin
QueryInterfaceThunk:
=TInterfaceRef(I)^.QueryInterfaceThunk;
caseQueryInterfaceThunk.AddInstructionof
AddByte:
Inc(PChar(Result),QueryInterfaceThunk.AdjustmentByte);
AddLong:
Inc(PChar(Result),QueryInterfaceThunk.AdjustmentLong);
else
Result:
=nil;
end;
end;
except
Result:
=nil;
end;
end;

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

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

分享到:
评论

相关推荐

    commons-logging-1.1.3-bin.tar.gz

    在实际使用中,我们通常不需要直接创建`Log`对象,而是通过`LogFactory.getLog(Class)`方法获取。例如: ```java import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public ...

    Delphi functions for CPU information

    在IT领域,Delphi是一种流行的面向对象的编程语言,它基于Pascal并提供了强大的Windows应用程序开发工具。在处理CPU相关信息时,Delphi程序员...在实际项目中,根据需求选择合适的方法获取和处理CPU信息是至关重要的。

    BCRYPT FOR DELPHI AND C++

    在Delphi中,BCrypt的实现通常依赖于第三方库,如`BCryptLib`或`JEDI Code Library (JCL)`。这些库提供了API接口,允许开发者使用BCrypt的函数,如`BCryptHashData`和`BCryptVerifyHash`,来对密码进行哈希处理和...

    Delphi CPU占用率

    除了使用API,还可以利用第三方库如JCL (Jedi Code Library) 或者 embarcadero 自己的VCL组件,这些库提供了封装好的接口,简化了CPU监控的实现过程。例如,JCL中的`JclSystemInfo`单元包含了获取系统信息和监控功能...

    计算机操作系统习题库.pdf

    9. 作业控制语言(JCL)用于批处理系统中,用于指定作业的执行流程和参数。 10. 作业控制块(JCB)是作业存在的唯一标志,包含作业的状态、资源需求等信息。 11. 时钟中断属于外部中断,用于实现定时和调度等功能...

    操作系统基础和实体讲解.pdf

    - **对象模式**:面向对象设计,每个对象都封装了数据和处理这些数据的方法。 - **对称多处理模式**:多处理器系统中,每个处理器地位平等,共同执行操作系统和应用程序。 #### 二、处理机管理 **2.1 进程的概念**...

    十个 log4j 转移到LogBack的理由

    LogBack 是一个日志框架,它是 Log4j 的后继者,由 Log4j 的创始人 Ceki Gülcü 与 Sébastien Pennec 共同创建。本文将探讨十个理由,解释为什么你应该从 log4j 迁移到 LogBack。 1. **性能提升**:LogBack 在...

    ABCs of zOS System Programming Volume1.pdf

    是一种集成的企业级服务器操作系统,它将多种关键功能整合到一个产品中,包括前沿且开放的通信服务、分布式数据与文件服务、并行Sysplex系统支持、面向对象编程、分布式计算环境(DCE)以及开放式应用程序接口。...

    ABCs of zOS System Programming Volume 1

    在z/OS环境中,UNIX文件是一种特殊的数据集形式,它使用UNIX文件系统的接口进行操作,为用户提供了一个熟悉的UNIX环境。 #### 2.8 非VSAM数据集规格 对于非VSAM数据集,需要指定相应的数据集规格,如记录格式、...

Global site tag (gtag.js) - Google Analytics