Windows Script Component и наследование интерфейса

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Windows Script Component и наследование интерфейса

Сообщение ALX_2002 » 21.01.2017 (Сб) 23:42

Доброго времени суток старожилам форума. ) Снова пришёл к Вам за советом.
Ковыряюсь с Windows Script Component (WSC)(механизм генерации COM объектов из XML файла).

Поизучал материалы:
https://msdn.microsoft.com/en-us/library/ms974602.aspx
https://perlhelp.web.cern.ch/PerlHelp/W ... nents.html

Возникла мысль попробовать собрать объект наследующий интерфейс IVBSAXContentHandler, чтобы сделать удобный SAX парсер XML для скриптов не создавая COM на VB6.
Почитал и выяснил, что WSC может наследовать интерфейсы за счёт тэга <implements> - https://perlhelp.web.cern.ch/PerlHelp/W ... ml#elemimp
The Implements Element

The Implements element enables you to include more COM interface handlers within your script.

Syntax:

<implements type="COMHandlerName" [id="internalName"] [default=fAssumed] >
Information related to the COMHandler goes here
</implements>

Но, к сожалению, выяснил, что наследуются только интерфейсы, которые включены в scrobj.dll (если я правильно понял). И параметр type может принимать только значения:
ASP - для наследования интерфейса внутри ASP страниц (связь с Response / Request объектами)
Behavior - для наследования интерфейса внутри HTML страниц (связь с событиями и элементами HTML страницы)
Automation - вот с этим не совсем понял. Для наследования интерфейса - OLE Automation ? Что это даёт ? Просто "высунуть" методы и свойства объекта ?

Решил поэкспериментировать с последним. Сваял компонент sax.sct (он во вложении к сообщению), добавил туда свойства и методы, которые должны быть наследованы и написал скрипт:

Код: Выделить всё
Option Explicit
Dim SAXXMLReader, _
   ContentHandler

Set SAXXMLReader = CreateObject("MSXML2.SAXXMLReader.6.0")
Set ContentHandler = GetObject("script:file:sax.sct")

MsgBox TypeName(ContentHandler)

Set SAXXMLReader.contentHandler = ContentHandler


Логично, что последняя строчка выдаёт сообщение Type Mismatch - Несоответствие типа. Вот тут то и возникло 2 вопроса:
1) Как происходит проверка типа объекта ? Т.е как SAXXMLReader узнаёт, что я скармливаю ему объект не того типа
2) Можно ли каким-то образом заставить WSC наследовать нужный мне интерфейс ?

Проект на VBScript и VB6 прикладываю к сообщению.
Вложения
test.zip
(5.45 Кб) Скачиваний: 163

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Windows Script Component и наследование интерфейса

Сообщение Хакер » 24.01.2017 (Вт) 0:21

Вообще, тут есть важное заблуждение.

Ты путаешься понятия «наследовать» и «поддерживать»/«реализовывать»/«импементировать». Implements не имеет никакого отношения к наследованию, это провозглашения того, что класс обязуется поддерживать интерфейс. Надеюсь, что путаница только на уровне слов, но не на уровне понимания

ALX_2002 писал(а):Логично, что последняя строчка выдаёт сообщение Type Mismatch - Несоответствие типа. Вот тут то и возникло 2 вопроса:
1) Как происходит проверка типа объекта ? Т.е как SAXXMLReader узнаёт, что я скармливаю ему объект не того типа
.

В типизированном языке (VB) при присвоении какого-то значения какому-то свойству или переменной в первую очередь VB попытается привести тип значения к типу переменной. В случае объектов в роли типа выступают COM-интерфейсы, поэтому приведения типа сводится к запрашиванию нужного интерфейса через вызов IUnknown::QueryInterface. Если объект, ссылка на некий интерфейс которого является присваиваемым значением, не поддерживает интерфейс, соответствующий типу переменной/свойства, то это выливается в ошибку Type mismatch.

В бестиповом VBScript, где всё завернуто в VARIANT, присваиваемое значение улетает в IDispatch::Invoke (который вызывается по случаю присвоения нового значения свойству), а дальше вопрос о том, как переварить переданное значение, это всецело забота реализации метода Invoke у конкретно взятого объекта. У большинства объектов, происхождение которых растёт из типизированых языков, сами методы (их аргументы и возвращаемые значения) и свойства вовсе не бестиповы, а потому дефолтная реализация Invoke будет всего-лишь переходником, который конвертирует VARIANT-ы и вызывают обыкновенные методы ожидающие значения конкретных типов.

Так или иначе, ноги у ошибки Type mismatch растут из сбоя при попытке IDispatch::QueryInterface.

Хотя, конечно, даже при успешном запрашивании нужного интерфейса, существует возможность (и вероятность), что сам код свойства может по любому поводу сгенерировать произвольную ошибку, в том числе и Type mismatch.

2) Можно ли каким-то образом заставить WSC наследовать нужный мне интерфейс ?

Судя по всему, нет. Но, вообще, надо поисследовать этот момент, посидеть с отладчиком может быть.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Windows Script Component и наследование интерфейса

Сообщение ALX_2002 » 24.01.2017 (Вт) 0:41

Хакер,
Надеюсь, что путаница только на уровне слов, но не на уровне понимания

Сэр, вы как всегда правы ! Проблема в понимании есть. Не смог понять чем отличается обязательство поддерживать и реальное наследование.

Так или иначе, ноги у ошибки Type mismatch растут из сбоя при попытке IDispatch::QueryInterface.

Хотя, конечно, даже при успешном запрашивании нужного интерфейса, существует возможность (и вероятность), что сам код свойства может по любому поводу сгенерировать произвольную ошибку, в том числе и Type mismatch.


Вот. Мне не хватало знания, что опрос идёт в QueryInterface, но понимал, что ошибку может сгенерить и уже сам код внутри свойства. Но чувствую, что скорее всего до него не добиваю, так как WSC наружу отдаёт только свой Automation к которому цепляет оболочки на мои функции.

Судя по всему, нет. Но, вообще, надо поисследовать этот момент, посидеть с отладчиком может быть.


Ага. Я поэтому и слепил 2 проекта. Один на VBS, другой на VB. Чтоб можно было запустить и сравнить что и как. К сожалению опыта использования отладчика у меня вообще нет, поэтому пытался кустарным методом через Sysinternals Process Monitor. Но естественно мне это ничего не дало, кроме как большей путаницы. Пробовал даже вытащить класс из VB проекта и оформить как ActiveX, чтоб потом глянуть его TLB и сравнить с TLB-кой от WSC. Посмотрел на оба. Разница в Inherited Interface (т.е явно есть Implemented интерфейс ContentHandler-а) у ActiveX. А у WSC-ки естественно нет... Но можно ли это как-то сделать. Не знаю.

P.S А где-нибудь есть статья где взять отладчик и мануалка по его использованию ? :roll:

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Re: Windows Script Component и наследование интерфейса

Сообщение NashRus » 25.01.2017 (Ср) 8:12

Offtopic
2017 год. не проще взять PowerShell?

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Windows Script Component и наследование интерфейса

Сообщение Teranas » 25.01.2017 (Ср) 10:58

Ну, PowerShell надо ещё знать, а VBS владеет почти каждый :)
С уважением, Андрей.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Windows Script Component и наследование интерфейса

Сообщение ALX_2002 » 25.01.2017 (Ср) 15:55

NashRus, не могу не согласиться, но задача, в которой мне нужен такой объект, как раз требует использования VBS. Ну и к тому же действительно VBS мне ближе чем PowerShell.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 66

    TopList