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

Com 从JScript(或任何ActiveScripting)访问Windows联系人(Win10之前),com,activex,jscript,wsh,active-script,Com,Activex,Jscript,Wsh,Active Script,我想通过ActiveScripting(JScript、VBScript、Python等)将COM对象与progIDWindows.Contact.1一起使用 此COM驻留在C:\ProgramFiles(x86)\Common Files\System\wab32.dll中。似乎没有可用的TypeLib。COM为“Windows通讯簿”(将联系人作为XML存储在文件夹中,如Windows 7中)提供了IContact 在JScript中,我做到了: var co=newActiveXObjec

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

此COM驻留在
C:\ProgramFiles(x86)\Common Files\System\wab32.dll
中。似乎没有可用的TypeLib。COM为“Windows通讯簿”(将联系人作为XML存储在文件夹中,如Windows 7中)提供了
IContact

在JScript中,我做到了:

var co=newActiveXObject(“Windows.Contact.1”);
公司类型;//结果:未知
由于它导致
未知
,我怀疑此COM无法用于脚本编写。我在某处读到,从
IUnknown
继承的所有内容都不能用于脚本编写,而必须从
IDispatch
继承。但我不确定其中有多少是有效的,是否有解决办法

我想请求确认我的怀疑(因为我对这一切都是陌生的,没有C++或C背景),或者如何使用<代码> Windows。从脚本中联系1。<代码>,包括一种方法,找出我可以使用的方法/对象,而不使用类型化。< /P>


我可以访问类似和相关的页面,但首先我需要在ActiveScript中获得一个实例(JScript、VBScript、Python、Lua都可以)。我还可以访问“MS OLE View”和。谢谢。

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

源自
IUnknown

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

  • 只需要一个众所周知的接口实现:
    IDispatch
  • 用于编程的别名:后期绑定、OLE自动化、COM自动化或简单自动化(不要与UI自动化混淆)
  • 为高级语言而发明(先是VB/VBA,后一点是ActiveScripting)
  • 仅由某类语言支持,并且它支持的方式不同(例如,它在C++中是支持的,但它不是像WISDOWStudio C++的代码> >导入/代码>指令那样的超级简单的W/O包装器或工具。JScript和VBScript在自动化方面并不完全支持相同的功能集
  • 您应该只使用预定义的类型列表“”:
  • 这些类型最初与VB/VBA非常相关(
    VARIANT
    SAFEARRAY
    BSTR
    ,意思是“基本字符串”…)
  • 从更高层次的语言来看,它确实使COM变得更加透明和容易,因为这是整个要点(并且可以使它从较低层次的语言变得更难…),它还允许“语法糖”的细节
  • 注意,
    IDispatch
    实现可以是非常动态的,并且在运行时非常晚绑定(get id of name->invoke),但是大多数可用的编程工具在编译时(例如:.NET)完全冻结id/名称列表,因为它们支持
    双接口
接口:

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

IMHO,关于COM最好的一页介绍如下:

你说得对,因为这些接口源于IUnknown,你不能使用脚本接口(如VBScript或JScript)访问它们。您可以使用C/C++或.NET或任何其他支持IUnknown派生接口的语言来使用它们。这是否回答了您的问题@兰克马特:不,不是,因为问题不在于IUnknown和IDispatch之间的区别。正如我(现在)所理解的,IUnknown的东西在编译时被绑定,在运行时无法复制。必须通过IDispatch将其硬编码到组件中,或者必须写入另一个组件,以反映IUnknown交付并通过IDispatch将其公开。但这些都只是我自己的猜测,我想澄清一下,这样我就可以把这个话题写下来了。但无论如何,谢谢你