1

Тема: VBS: Работа с COM-объектами

Добрый день!
Я хочу написать небольшую COM-библиотеку, содержащую несколько классов под собственные нужды. Разработку веду в Delphi 7.
На текущий момент написал тестовый COM-объект, в котором содержится один единственный метод: GetSum(S1, S2), возвращающий сумму двух переданных аргументов.
После регистрации такого объекта в системе столкнулся с такой проблемой: если я обращаюсь к данному объекту из VBA (т.е. подключаю объект через Tools -> Refrences...), то работа с объектом идет без проблем, можно создавать экземпляр класса и обращаться к его методу. Если же я обращаюсь к этому классу из VBS с помощью процедуры CreateObject, то при попытке обратиться к методу класса возникает ошибка "Требуется объект FO", где FO - экземпляр класса COM-объекта.
В чем может быть причина ошибки? Может быть, есть какие-то ресурсы, где можно получит ликбез в разработке COM под VBS?

Заранее большое спасибо за помощь!

2

Re: VBS: Работа с COM-объектами

А что вы указали в параметрах createobject(?) ?
Полагаю там и ошибка.

COM он и в Африке СОМ - ЯЗЫКОНЕЗАВИСИМ.

(OFF: чем кстати и "пренебрегают" некоторые коллеги, захламляя коллекцию одинаковыми скриптами с небольшими языково-синтаксическими отличиями в разных ветках. Но это уже тема организационных вопросов.)

Другое дело - обязательное наличие в сом'е Dispatch-интерфейса.
Но, опять же, полагаю что с этим всё в порядке (в delphi всё это создаётся по умолчанию).

В общем, дело в ProgID.

3

Re: VBS: Работа с COM-объектами

И ещё:
reference - раннее связывание - недоступно в VBScript (во всяком случае глубоко ковырять придётся).

4

Re: VBS: Работа с COM-объектами

Вот пример неработающего кода VBS:

Set FO = CreateObject("voam.FileObject")
Res = FO.GetSum(1,1)
MsgBox Res

... а вот работающий код вызова объекта из VBA:

Sub Test()
Dim FO As voam.FileObject

Set FO = New voam.FileObject
Debug.Print FO.GetSum(1, 1)
End Sub

5 (изменено: Аскет, 2012-03-26 01:49:20)

Re: VBS: Работа с COM-объектами

"voam.FileObject"

Скорее всего это некорректный идентификатор.
Поковыряте COM-браузером и посмотрете какой там progid, наилучший вариант на мой взгляд, PBrow - http://forum.script-coding.com/viewtopi … 437#p55437или специально предназначенный для этих целей COM-informer-http://forum.script-coding.com/viewtopi … 439#p55439

6

Re: VBS: Работа с COM-объектами

voam, надо смотреть на какие-то детали создания библиотек серверов Automation, возможно, специфичных именно для Delphi. Вот что я сходу нашёл — Building a COM Server - COM, COM+, Delphi Tutorials and References - Binh Ly [выделение моё]:


Creating COM Components

In Delphi, we can create several types of COM components:

    1. COM Object - a COM component that does not support IDispatch/Automation. This is used to build lightweight COM components such as Windows shell extensions and non-scriptable servers such as plugins, etc.

    2. Automation Object - a COM component that supports IDispatch/Automation. This is used to build COM components that are scriptable and support late-binding, in addition to being able to implement a standard vtable interface. In general, this is the most common type of COM component that we are going to create.

ну, и так далее.

7

Re: VBS: Работа с COM-объектами

Не надо путать. )
Давайте порассуждаем логически:
В любом случае это не IUnknown - ведь в vba-то код работает (что выше), а VB(A) и знать не знает что такое IUnknown.
Следовательно это disp (т.е. Automation).
Смотреть нужно в сторону корректности ProgID, а он может отличаться от имени в reference'ах (вообще, в delphi по-умолчанию стоит типа "Progect1.Class1").

Хотя могу в чем-то ошибаться

8

Re: VBS: Работа с COM-объектами

voam, сможешь выложить dll-ку?

9

Re: VBS: Работа с COM-объектами

Аскет пишет:

Давайте порассуждаем логически:

Давайте будем просто читать внимательнее:

voam пишет:

После регистрации такого объекта в системе столкнулся с такой проблемой: если я обращаюсь к данному объекту из VBA (т.е. подключаю объект через Tools -> Refrences...), то работа с объектом идет без проблем, можно создавать экземпляр класса и обращаться к его методу. Если же я обращаюсь к этому классу из VBS с помощью процедуры CreateObject, то при попытке обратиться к методу класса возникает ошибка "Требуется объект FO", где FO - экземпляр класса COM-объекта.

10 (изменено: Аскет, 2012-03-26 13:37:37)

Re: VBS: Работа с COM-объектами

Да, вы правы. Это другое. Получается что вызов CreateObject проходит без ошибок, знакомая ситуация. Но почему тогда через референцы в vba работает?

MsgBox typeName(FO)
=Unknown?

11

Re: VBS: Работа с COM-объектами

Большое спасибо всем за участие!
Выложить DLL-ку и потестировать запросы смогу, к сожалению, только вечером ... обязательно отпишусь!
Аскет, думаю, что при попытке вызова typeName тоже будет ошибка "Требуется объект FO" ... в любом случае, проверю!

12

Re: VBS: Работа с COM-объектами

Доброго времени суток!
Здесь можно скачать саму библиотеку.
Аскет, я проверил typeName объекта FO - функция возвращает результат "FileObject"! Т.е. название класса в ActiveX.

13

Re: VBS: Работа с COM-объектами

Заинтересовался темой. )

Сравнил в OLEVIEW интерфейсы

Бибилотека voam.dll
http://zalil.ru/32956905/446e9bf3.4f717768/1.gif

Библиотека scrrun.dll
http://zalil.ru/32956909/446e9bf3.4f717768/2.gif

voam, на сколько я понимаю, и помню, для движка WSH / WSC и т.п требуется интерфейс iDispatch. Без него скрипт не знает какие методы и свойства у объекта. Видимо и Вам тоже необходимо его реализовать.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

14

Re: VBS: Работа с COM-объектами

Xameleon, alexii, Вы абсолютно правы!
Проштудировав материалы, обнаружил, что я спроектировал ActiveX неправильного типа: мой проект содержал класс типа "COM Object", в то время как необходимо было использовать специальный тип "Automation Object", после чего в интерфейс автоматически были добавлены необходимые описания, и объект стал доступен в VBS!
Странно, правда, что предыдущий вариант (COM Object) работал в VBA...

Еще раз большое спасибо всем за участие!

15

Re: VBS: Работа с COM-объектами

#2

Аскет пишет:

Другое дело - обязательное наличие в сом'е Dispatch-интерфейса.

Но почему же работает в VBA?
Ссылки - статическое (раннее) связывание с "обычными" интерфейсами, вопреки динамическому [CreateObject] с IDispatch  (англ. Dispatch - посылать/отправка).

IDispatch применяется в тех случаях, где нужна интерпретация. (rsdn: "COM vs. CORBA")

16

Re: VBS: Работа с COM-объектами

voam, расскажите, что в ней реализуете, интересно же.