如何在自定义变体上捕获数组索引
Posted
技术标签:
【中文标题】如何在自定义变体上捕获数组索引【英文标题】:How to catch array index(es) on custom variant 【发布时间】:2013-10-29 21:39:36 【问题描述】:我正在阅读有关 TCustomVariantType 的信息,并想知道是否有一种方法可以覆盖使用一个或多个数组索引调用自定义变体类型的变量时的行为。如果我在a[1]
上使用调试DCU 进行快速调试,其中a
是一个变体,我看到_VarArrayGet
被调用,但它会调用SafeArrayPtrOfIndex
或SafeArrayGetElement
,而无法提供替代。我看到旧版本曾经有一个 VariantManager,但这已被弃用。有没有办法替换_VarArrayGet
指针?
【问题讨论】:
显然,对我来说,不可能。动机是什么? 既然您要问,对于github.com/stijnsanders/TMongoWire,如果 BSON 有一个具有相似键集的文档数组,那么如果您可以使用单个 IBSONDocument 迭代数组并在内部使用键的相同记录数组。一种回收内存,而不是一直丢弃和重新分配。使用简单的a[x]
语法让它工作会很好,但现在我想我必须使用类似 IEnumVariant 的东西(呃)。
我又看了一遍,我想我可以改写一下这个问题:不推荐使用 TVariantManager,系统是如何连接的,以便a[x]
最终成为对VarArrayGet(a,[x])
的调用?我需要深入到系统中去修改 Variants.pas 和它的 dcu 吗?
【参考方案1】:
系统如何连接以使 a[x] 最终调用 VarArrayGet(a,[x])?
现代版本的 Delphi 中的编译器内置了变体知识,并将调用硬连接到 VarArrayGet
。查看 x86 编译器发出的代码:
d := V[0];
翻译成:
004234D7 6A00 推 00 美元 004234D9 6A01 推 01 美元 004234DB 6858AF4200 推 $0042af58 004234E0 8D45C8 lea eax,[ebp-$38] 004234E3 50 推 004234E4 E81BD8FFFF 调用@VarArrayGet 004234E9 83C410 加特别是 10 美元 004234EC 8D45C8 lea eax,[ebp-$38] 004234EF E864B8FFFF 调用@VarToReal 004234F4 DD1D68AF4200 fstp qword ptr [$0042af68] 004234FA 9B 等待您根本没有可用的扩展点。
如果您希望更改行为,最好的选择是使用运行时代码绕行。
【讨论】:
我猜不可能“覆盖”@VarArrayGet
?任何奇怪的肮脏伎俩都可以。 (运行时代码绕行是什么意思?)
en.wikipedia.org/wiki/Hooking 我想知道你在这个问题上还需要什么以上是关于如何在自定义变体上捕获数组索引的主要内容,如果未能解决你的问题,请参考以下文章
如何捕获 UIButton 事件:在自定义 UITableViewCell 实现中添加了 UIButton