Доступ к контактам Windows (до Win10) из JScript (или любого ActiveScripting)

Я хочу использовать COM-объект с progID Windows.Contact.1 через ActiveScripting (JScript, VBScript, Python и т. д.).

Этот COM находится в C:\Program Files (x86)\Common Files\System\wab32.dll. Кажется, для него нет TypeLib. COM предоставляет, среди прочего,IContactдля "Адресной книги Windows" (хранение контактов в виде 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.

У меня есть доступ к таким страницам, как Программирование контактов Windows и связанным с ними, но сначала мне нужно получить экземпляр в ActiveScript (подойдет JScript, VBScript, Python, Lua). У меня также есть доступ к таким приложениям, как "MS OLE View" и "OLEView DotNet". Спасибо.

1 ответ

Решение

По этой теме есть целые книги, но вот очень упрощенная история. Существует три основных категории COM-интерфейсов:

Интерфейсы, производные от 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 Automation)
  • изобретен для языков более высокого уровня (сначала VB/VBA, чуть позже ActiveScripting)
  • поддерживается только определенным классом языка, и то, как он поддерживается, различается (например, он поддерживается в C++, конечно, но это не очень просто без оболочек или инструментов, таких как Visual Studio C++ #importдиректива). JScript и VBScript не совсем поддерживают один и тот же набор функций в отношении автоматизации.
  • вы должны использовать только предопределенный список типов "Типы, совместимые с автоматизацией":
  • эти типы изначально были очень связаны с VB/VBA (VARIANT, SAFEARRAY, BSTR что означает "Базовая строка"...)
  • от языка более высокого уровня, он действительно делает COM намного прозрачнее и проще, поскольку в этом была вся суть (и может усложнить его с языка более низкого уровня...), он также допускает тонкости "синтаксического сахара"
  • Обратите внимание IDispatch реализация может быть очень динамичной и действительно с поздним связыванием во время выполнения (получить идентификатор имени -> вызвать), но большинство доступных инструментов программирования довольно замораживают список идентификаторов / имен во время компиляции (например,.NET), потому что они поддерживают Dual интерфейсы.

Dual интерфейсы:

  • интерфейсы, реализующие индивидуальный IDispatch-derived интерфейс и реализация IDispatchсам, чтобы соответствовать пользовательскому интерфейсу (конечно, обе реализации предположительно "эквивалентны"). Взгляните на ссылку ниже, там красивые изображения.
  • из-за IDispatch, вы должны использовать только типы данных, совместимые с автоматизацией, в IDispatch-производный метод.
  • это больше работы для реализации (поэтому обычно это делается с помощью инструментов программирования, например: ATL)
  • немного проще для нативных (C/C++ и т. д.) вызывающих (нет необходимости использовать IDispatch оболочки), но вам все равно нужно переваривать типы данных автоматизации

IMHO, одно из лучших одностраничных введений в COM находится здесь: Введение в COM

Другие вопросы по тегам