2

我试图在 delphi 中执行此操作,但不确定 CTYPE 函数。

Dim docStyleSheet As mshtml.IHTMLStyleSheet = CType(doc.styleSheets.item(0), mshtml.IHTMLStyleSheet)
Dim docStyleRules As mshtml.HTMLStyleSheetRulesCollection = CType(docStyleSheet.rules, mshtml.HTMLStyleSheetRulesCollection)

为什么我们不能简单地在 delphi 中这样做:

stylesheet :=  document.styleSheets.item(0) As IHTMLStyleSheet;

完整的代码可以在这个链接找到 https://stackoverflow.com/a/2996819

Tlama,David...thanx 进行更正,是的,它是一个 vb 代码。

4

1 回答 1

3

作为。答案被扩展了几次,因为越来越多的信息被发现将问题从“什么是 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来检查您是否获得varUnknownvarDispatch在尝试IUnknown摆脱返回值之前.

PS。这个问题现在似乎是重复的。

于 2013-06-20T12:06:17.410 回答