4

我正在阅读有关 TCustomVariantType 的信息,并想知道是否有一种方法可以在使用一个或多个数组索引调用自定义变体类型的变量时覆盖该行为。如果我使用调试 DCU 对a[1]where ais a variant 进行快速调试,我会看到_VarArrayGet被调用,但它会汇集到对SafeArrayPtrOfIndexor的调用SafeArrayGetElement,而无法提供替代方法。我看到旧版本曾经有一个 VariantManager,但这已被弃用。有没有办法替换_VarArrayGet指针?

4

1 回答 1

0

系统如何连接以使 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 等待

您根本没有可用的扩展点。

如果您希望更改行为,最好的选择是使用运行时代码绕行。

于 2014-03-20T20:29:28.507 回答