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

时间:2020-02-16 16:19:01

标签: com activex jscript wsh active-script

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

此COM位于C:\Program Files (x86)\Common Files\System\wab32.dll中。似乎没有TypeLib可用。 COM除其他外,还为“ Windows通讯簿” 提供IContact(与Windows 7一样,将联系人存储为XML)。 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" 之类的应用程序。谢谢。

1 个答案:

答案 0 :(得分:1)

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

源自IUnknown的接口

  • 针对以下方面的编程别名:早期绑定,(自定义)vtable绑定
  • 实现COM“服务器”的最简单方法
  • 它只是一个 binary 合约(方法布局,方法签名,参数行为,例如跨部门/流程支持的in /​​ out等)
  • 您需要以某种方式告诉呼叫者您支持的二进制合同是什么(可以使用呼叫者可以理解的.idl,.tlb或任何
  • 有一些官方的方法来记录您的IUnknown派生的接口:.idl-> .h和.tlb是最标准的方法。
  • 仅由某些特定类型的语言(例如C / C ++ 、. NET,Delphi),理解.tlb(或.idl或等效的.h)的语言或允许手动重新定义布局的语言(如)支持。净)。您可以使用.tlb完美定义一种可以不执行任何操作的语言。那就是COM的优点,它只是一个二进制合同。
  • 如果您的语言不支持它,那么您就不能使用它,您必须使用支持它的语言编写或使用包装器,并以您的语言支持的方式公开它。例如,Powershell不支持IUnknown-derived接口(我不确定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-> invoke),但是大多数可用的编程工具在编译时都会冻结ID /名称的列表(例如: .NET),因为它们支持Dual接口。

Dual界面:

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

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

相关问题