W
wodesnake
Unregistered / Unconfirmed
GUEST, unregistred user!
个人在看DELPHI中关于从类中获取接口中的源码,下面是寻找接口的代码<br>class function TObject.GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;<br>{$IFDEF PUREPASCAL}<br>var<br> ClassPtr: TClass;<br> IntfTable: PInterfaceTable;<br> I: Integer;<br>begin<br> ClassPtr := Self;<br> while ClassPtr <> nil do<br> begin<br> IntfTable := ClassPtr.GetInterfaceTable;<br> if IntfTable <> nil then<br> for I := 0 to IntfTable.EntryCount-1 do<br> begin<br> Result := @IntfTable.Entries;<br>// if Result^.IID = IID then Exit;<br> if (Int64(Result^.IID.D1) = Int64(IID.D1)) and<br> (Int64(Result^.IID.D4) = Int64(IID.D4)) then Exit;<br> end;<br> ClassPtr := ClassPtr.ClassParent;<br> end;<br> Result := nil;<br>end;<br>{$ELSE}<br>主要搞不懂这一段,BORLAND为什么把下面一句判断注释掉,而使用第二种判断方式<br>// if Result^.IID = IID then Exit;<br> if (Int64(Result^.IID.D1) = Int64(IID.D1)) and<br> (Int64(Result^.IID.D4) = Int64(IID.D4)) then Exit;<br>GUID比较应该比较16个字节,对于第二种比较方式怎么看起来也没有比较16个字节,<br>(Int64(Result^.IID.D1) = Int64(IID.D1)) , GUID中的D1都只占4个字节,经过类型转换<br>也只是值转换成64位(8个字节)的整形,但并没有从D1开始取8个字节进行比较。那么D2,D3共4个字节都没有比较,这个怎么能判断两个GUID相等了?<br><br> var<br> b: Byte;<br> I: Integer;<br> b := 50;<br> I := Integer(b); //像这种类似的转换,只是把b的值50赋给I罢了,而不是从b单元开始的4个字节的值赋给I。<br>同理 (Int64(Result^.IID.D1) = Int64(IID.D1)) 只比较4个字节,所以D2,D3共4个字节并没有参与比较,难道真的只能理解两个GUID的D2,D3出现相同的概率相当小