从JScript(或任何ActiveScripting)访问Windows联系人(Win10之前的版本)

问题描述 投票:0回答:1

我想通过ActiveScripting(JScript,VBScript,Python等)将COM对象与progID Windows.Contact.1一起使用。

此COM位于C:\Program Files (x86)\Common Files\System\wab32.dll中。似乎没有TypeLib可用。除其他外,COM为“ Windows通讯簿”提供IContact(将联系人作为XML存储在文件夹中,如Windows 7中一样)。 IContact is documented here

在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"之类的应用程序。谢谢。

com activex jscript wsh active-script
1个回答
0
投票

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

源自IUnknown的接口

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

IDispatch接口

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

Dual接口:

  • 实现自定义IDispatch-derived接口并实现IDispatch本身以匹配自定义接口的接口(当然,这两个实现都应该是“等效的”)。看看链接,它有漂亮的图像。
  • 由于IDispatch,您应该在IDispatch派生的方法中仅使用与自动化兼容的数据类型。
  • 要执行的更多工作(通常由工具完成,例如:ATL)
  • 对于C / C ++调用者来说比较容易(不需要使用IDispatch包装器,但是您仍然必须摘要自动化数据类型

恕我直言,关于COM的最佳1页介绍之一在这里:Introduction to COM

© www.soinside.com 2019 - 2024. All rights reserved.