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

本文分享了一段来自JCL库中关于接口实现调整的代码片段,并对其进行了详细解释。文章强调了在运行时,接口与对象指针的偏移是通过硬编码的汇编指令来实现的,读者可以通过理解这些指令来掌握接口转换的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<p style="text-indent: 21pt;">我原本并不想单独发以下JCL的方法,可是想到很多人可能还是不知道的。另外,从我博客的回复上看,很多人也愿意去了解一下,特此贴出JCL中的代码。</p>
<p style="text-indent: 21pt;"><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></p>
<blockquote>
<pre><code><span style="font: 10pt courier new;"><span class="pas1-comment"><div style="padding-right: 5.4pt; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; width: 95%; padding-top: 4px;"><div>
<img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif"><span style="color: #008000;">//</span><span style="color: #008000;">===Interfaceinformation==================================================</span><span style="color: #008000;"><br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif"></span><span style="color: #000000;"><br>functionGetImplementorOfInterface(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">I:IInterface):TObject;<br><img id="_146_196_Open_Image" align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif"><img id="_146_196_Closed_Image" style="display: none;" align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif"></span><span id="_146_196_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff;">...</span><span id="_146_196_Open_Text"><span style="color: #000000;">{TODO</span><span style="color: #000000;">-</span><span style="color: #000000;">cDOC:OriginalcodebyHallvardVassbotn}</span></span><span style="color: #000000;"><br><img id="_198_277_Open_Image" align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif"><img id="_198_277_Closed_Image" style="display: none;" align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif"></span><span id="_198_277_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff;">...</span><span id="_198_277_Open_Text"><span style="color: #000000;">{TODO</span><span style="color: #000000;">-</span><span style="color: #000000;">cTesting:Checktheimplemetation</span><span style="color: #0000ff;">for</span><span style="color: #000000;">anyfurtherversionofcompiler}</span></span><span style="color: #000000;"><br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif"></span><span style="color: #0000ff;">const</span><span style="color: #000000;"><br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">AddByte</span><span style="color: #000000;">=</span><span style="color: #000000;">$</span><span style="color: #000000;">04244483</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">opcodeforADDDWORDPTR[ESP+4],Shortint</span><span style="color: #008000;"><br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif"></span><span style="color: #000000;">AddLong</span><span style="color: #000000;">=</span><span style="color: #000000;">$</span><span style="color: #000000;">04244481</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">opcodeforADDDWORDPTR[ESP+4],Longint</span><span style="color: #008000;"><br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif"></span><span style="color: #000000;">type<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">PAdjustSelfThunk</span><span style="color: #000000;">=</span><span style="color: #000000;"></span><span style="color: #000000;">^</span><span style="color: #000000;">TAdjustSelfThunk;<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">TAdjustSelfThunk</span><span style="color: #000000;">=</span><span style="color: #000000;">packedrecord<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif"></span><span style="color: #0000ff;">case</span><span style="color: #000000;">AddInstruction:Longintof<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">AddByte:(AdjustmentByte:ShortInt);<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">AddLong:(AdjustmentLong:Longint);<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">end;<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">PInterfaceMT</span><span style="color: #000000;">=</span><span style="color: #000000;"></span><span style="color: #000000;">^</span><span style="color: #000000;">TInterfaceMT;<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">TInterfaceMT</span><span style="color: #000000;">=</span><span style="color: #000000;">packedrecord<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">QueryInterfaceThunk:PAdjustSelfThunk;<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">end;<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">TInterfaceRef</span><span style="color: #000000;">=</span><span style="color: #000000;"></span><span style="color: #000000;">^</span><span style="color: #000000;">PInterfaceMT;<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">var<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">QueryInterfaceThunk:PAdjustSelfThunk;<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">begin<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif"></span><span style="color: #0000ff;">try</span><span style="color: #000000;"><br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">Result:</span><span style="color: #000000;">=</span><span style="color: #000000;">Pointer(I);<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif"></span><span style="color: #0000ff;">if</span><span style="color: #000000;">Assigned(Result)then<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">begin<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">QueryInterfaceThunk:</span><span style="color: #000000;">=</span><span style="color: #000000;">TInterfaceRef(I)</span><span style="color: #000000;">^</span><span style="color: #000000;">.QueryInterfaceThunk;<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif"></span><span style="color: #0000ff;">case</span><span style="color: #000000;">QueryInterfaceThunk.AddInstructionof<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">AddByte:<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">Inc(PChar(Result),QueryInterfaceThunk.AdjustmentByte);<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">AddLong:<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">Inc(PChar(Result),QueryInterfaceThunk.AdjustmentLong);<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif"></span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">Result:</span><span style="color: #000000;">=</span><span style="color: #000000;">nil;<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">end;<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">end;<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">except<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">Result:</span><span style="color: #000000;">=</span><span style="color: #000000;">nil;<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">end;<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif">end;<br><img align="top" alt="" src="http://images.youkuaiyun.com/syntaxhighlighting/OutliningIndicators/None.gif"></span>
</div></div></span></span></code></pre>
</blockquote>
<p style="text-indent: 21pt;">注释:这段代码出自JCL代码中JclSysUtils单元中。</p>
<p style="text-indent: 21pt;">提示:读这段代码,要明白一个道理,在代码执行过程中,接口和对象指针的偏移是硬编码的在汇编中的。转换的过程,就是解析这段汇编的过程。</p>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值