0

我想Windows.Contact.1通过 ActiveScripting(JScript、VBScript、Python 等)使用带有 progID 的 COM 对象。

此 COM 位于C:\Program Files (x86)\Common Files\System\wab32.dll. 似乎没有可用的 TypeLib。COM 提供“Windows 通讯簿”等IContact功能将联系人作为 XML 存储在文件夹中,如 Windows 7 中)。IContact 记录在这里

在 JScript 中,我做了:

var co = new ActiveXObject("Windows.Contact.1");
typeof co;  // results in: unknown

由于它导致unknown,我怀疑这个 COM 不能用于脚本。我在某处读到,继承自的所有内容IUnknown都不能用于脚本,而是必须继承自IDispatch. 但我不确定其中有多少是有效的,以及是否有解决方法。

我想要求承认我的怀疑(因为我是这一切的新手,并且没有 C++ 或 C# 背景)或要求一种方法,如何Windows.Contact.1从脚本中使用,包括一种方法来找出,我可以使用哪些方法/对象,而无需求助于 TypeLib。

我可以访问诸如Programming Windows Contacts和相关页面之类的页面,但首先我需要在 ActiveScript 中获取一个实例(JScript、VBScript、Python、Lua 都可以)。我还可以访问“MS OLE View”“OLEView DotNet”等应用程序。谢谢你。

4

1 回答 1

1

关于这个主题有整本书,但这里有一个非常简化的故事。COM接口基本上有3个“类别”:

接口派生自IUnknown

  • 编程的别名:早期绑定,(自定义)vtable 绑定
  • 实现 COM“服务器”的最简单方法
  • 它只是一个二进制合约(方法布局、方法签名、参数行为,如用于跨单元/进程支持的输入/输出,...)
  • 您需要以某种方式告诉您的呼叫者您支持的二进制合约是什么(您可以使用 .idl、.tlb 或您的呼叫者可以理解的任何内容)
  • 有一些官方方法可以记录您的 IUnknown 派生接口:.idl -> .h 和 .tlb 是最标准的方法
  • 仅由特定类别的语言(例如 C/C++、.NET、Delphi)、理解 .tlb(或 .idl 或等效 .h)的语言或允许手动重新定义布局的语言(如 .NET)支持。您可以完美地定义一种无需使用 .tlb 就可以做到这一点的语言。这就是 COM 的美妙之处,它只是一个二进制合约。
  • 如果你的语言不支持它,你就不能使用它,你必须编写或使用支持它的语言的包装器,并以你的语言支持的方式公开它。例如,Powershell 不支持IUnknown-derived接口(我不是 100% 确定)但支持 .NET,因此它可以将 .NET 用作“超级包装器”。

IDispatch界面

  • 只需要一个IUnknown众所周知的接口实现:IDispatch
  • 编程的别名:后期绑定、OLE 自动化、COM 自动化或简单的自动化(不要与 UI 自动化混淆)
  • 为高级语言发明(首先是 VB/VBA,稍后是 ActiveScripting)
  • 仅受某一类语言的支持,并且支持的方式各不相同(例如,它当然在 C++ 中受支持,但如果没有像 Visual Studio 的 C++#import指令这样的包装器或工具,它并不是超级容易的)。JScript 和 VBScript 在自动化方面并不完全支持同一组功能。
  • 您应该只使用预定义的类型列表“自动化兼容类型”:
  • 这些类型最初与 VB/VBA 非常相关(VARIANT, SAFEARRAYBSTR表示“基本字符串”...)
  • 从高级语言来看,它确实使 COM 变得更加透明和容易,因为这就是重点(并且可以使其从较低级别的语言变得更难......),它还允许“语法糖”的细节
  • 请注意,IDispatch实现可能是非常动态的,并且在运行时确实是后期绑定的(获取名称的 id -> 调用),但大多数可用的编程工具在编译时完全冻结了 ids/names 列表(例如:.NET),因为它们支持Dual接口。

Dual接口:

  • 实现自定义IDispatch-derived接口并实现IDispatch自身以匹配自定义接口的接口(当然,这两种实现都被认为是“等效的”)。看看下面的链接,它有很好的图像。
  • 因为IDispatch,您应该在IDispatch-derived 方法中仅使用与自动化兼容的数据类型。
  • 实现的工作量更大(因此通常由编程工具完成,例如:ATL)
  • 对于本机(C/C++ 等)调用者来说更容易一些(无需使用IDispatch包装器),但您仍然需要消化自动化数据类型

恕我直言,COM 最好的 1 页介绍之一在这里:COM 简介

于 2020-02-18T08:36:01.383 回答