作为。答案被扩展了几次,因为越来越多的信息被发现将问题从“什么是 CType 函数?” 到“如何将 OleVariant 转换为所需的接口类型?”。因此,答案逐渐涵盖了所有这些主题。
因此,您在 Microsoft Visual Basic 代码中遇到了未知函数。当他遇到未知的事情时,该怎么办?去谷歌。
带有文本的 Google.comCType MSDN
在其顶部结果中为我们提供了此链接:http: //msdn.microsoft.com/en-us/library/vstudio/4x2877xb.aspx
返回将表达式显式转换为指定数据类型、对象、结构、类或接口的结果。如果没有定义从表达式到类型名的转换(例如,从整数到日期),Visual Basic 将显示编译时错误消息。
所以我们必须在 Delphi 中重现类型转换,如果可能的话,最好是编译类型的类型转换。
带有文本的 Google.comtypecast docwiki
在其顶部结果中为我们提供了此链接:
这反过来又为我们提供了文本中引用的另一个链接:
所以你有两种语法可以尝试。您尝试并排除的一种-带有 AS 运算符的一种。然后尝试另一种直接类型转换语法。
stylesheet := IHTMLStyleSheet( document.styleSheets.item(0) );
有时,如果上述方法失败,它也有助于进行双重类型转换,Variant -> IUnknown -> certain interface
但在许多情况下,这只是上层代码的冗余版本。
stylesheet := IHTMLStyleSheet( IInterface( document.styleSheets.item(0) ) );
好吧,现在它被告知源表达式数据类型是OleVariant
我们可以阅读具有更精确目标的文档,关于Variant
数据类型转换(与现代 Delphi 中OleVariant
的差别不大):Variant
- AS 运算符适用于类、对象和接口。它不适用于
Variant
表达式。这回答了最初的“为什么我们不能……”的问题。
- 关于类型的文档
Variant
建议使用直接类型转换语法对其进行转换。
.
stylesheet := IInterface( document.styleSheets.item(0) ) as IHTMLStyleSheet;
如果愿意,您甚至可以使用(过度?)防御性编程,使用http://docwiki.embarcadero.com/Libraries/XE2/en/System.Variants.VarType来检查您是否获得varUnknown
或varDispatch
在尝试IUnknown
摆脱返回值之前.
PS。这个问题现在似乎是重复的。