| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > Передача объекта Array в COM - метод |
| Автор: log584 22.12.2010, 20:56 | ||||
Есть JScript - скрипт, запускаемый под IIS 5.0. В скрипте создается объект, реализуемый в проекте ATL на VSC++ 2008.
Как видно, созданный в скрипте объект типа Array присваивается свойству. Дальше. Ловлю данный объект на стороне сервера:
vParam->vt = 9 = VT_DISPATCH. А вот что это за IDispatch конкретно я не знаю. Соответственно и работать с ним далее не получается. В этом собственно, и весь вопрос. Как узнать что это за тип, что бы знать его методы. В инете информации о интерфейсах объекта JScript Array я не нашел, пролазил два дня. Помогите пожалуйста. |
| Автор: jonie 23.12.2010, 09:45 | ||
© отсюда: http://stackoverflow.com/questions/1926723/passing-array-of-bytes-from-activex-to-javascript-and-vice-versa/4345682#4345682 |
| Автор: log584 23.12.2010, 18:59 | ||
Да понятно, что не FileSystemObject. С объектом JScript Array я уже давно ознакомился в MSDN на локальной машине. xvr, на странице, в которую ты указал, описывается именно объект, используемый на стороне клиента автоматизации, а вот какой интерфейс использовать для доступа к методам кокласса данного объекта, на стороне C++, реализации COM сервера? Вот, может быть я изначально неточно сформулировал вопрос, извините. jonie, по - моему, года два назад у меня уже была подобная ситуация ( опять - же по - моему с помощью VBArray я и выкручивался), ладно, я попробую передавать COM - серверу объект VBArray, должно получиться, но все равно - это изврат. Изначально вопрос стоял о том, что за интерфейс реализован коклассом объекта Array, передаваемого из JScript на сторону C++? С тем, чтобы посмотреть его документацию и использовать его (на стороне C++ COM - сервера). Вот это будет самый верный путь. |
| Автор: xvr 23.12.2010, 20:31 | ||||
Полный список реализуемых интерфейсов был на строках 7-9 в листинге моем сообщении Угу. К сожалению стандартный метод передачи массивов в ActiveX (SAFEARRAY) интерпретатор JS не поддерживает
|
| Автор: log584 23.12.2010, 23:56 | ||||||
Тот же самый - это какой? (Какой интерфейс для C++?) Еще раз вопрос конкретно, какой интерфейс, его наименование, заголовочный файл из MSDN для C++? Ну пускай не из MSDN...
Какие такие методы и пропертя мне дают IUnknown, IDispatch (или интерфейсы классов), чтобы я смог вызывать конкретные методы кокласса для данного интерфейса объека Array? Да есть у меня IDispatch, который ни о чем еще не гововорит. IUnknown, IDispatch сами по себе не предназначены для получения информации о методах интерфейса. Да, еще, не реализован у моего объекта JScript Array, передаваемого на сторону C++ сервера интерфейс IDispatchEx!!! У объекта, переданного на сторону сервера, при попытке инстанциировать интерфейс типа IDispatchEx в HRESULT возвращается E_NOINTERFACE. ???????? И еще, скорей всего, как я понял Делфинарий?
А вот это ценная информация. И все равно, что за объект я получаю на стороне сервера? Может полный проект дать? |
| Автор: xvr 24.12.2010, 08:06 | ||||||||||
Вы хотели сказать - клиенту на С++? Т.к. сервер находится как раз внутри JS интерпретатора
IDispatch. НЕ DUAL, ПРОСТОЙ IDispatch. Вот, кусок из реального проекта:
В качестве имени используйте строку с индексом, (для индексации индексом 5 делайте так):
|
| Автор: log584 24.12.2010, 18:44 |
| Спасибо, дошло. Но все равно это не решение. Какой объект, в таком случае я должен создать на стороне C++ сервера, чтобы он, попав на сторону скрипта, там в скрипте имел тип Array? |
| Автор: xvr 24.12.2010, 21:10 | ||
В JS все объекты равноправны. А Array - это всего лишь один из встроенных объектов. Так что можно сделать IDispatch, который будет реализовывать методы Array, такой объект будет практически неотличим от родного JS Array'я. Полнофункциональный JS Array можно создать только внутри самого интерпретатора JS. Например попросив интерпретатор вычислить выражение new Array() или просто ([]), в результате будет возвращен VARIANT, содержащий IDispatch настоящего JS Array'я. А дальше его можно наполнять данными (через IDispatchEx::GetDispID c fdexNameEnsure) |
| Автор: log584 24.12.2010, 22:15 |
| Ладно, с этим разобрался. Спасибо большое за терпение. Если появятся дополнительные, надеюсь можно будет обратиться за помощью? |
| Автор: xvr 25.12.2010, 13:32 | ||
Конечно |
| Автор: log584 25.12.2010, 21:57 |
| Опять проблема. Если я правильно понял, то динамический создать элементы объекта массива на стороне COM - метода в виде индексированных свойств объекта можно только с помощью IDispatchEx. Если так, то нужно знать CLSID кокласса, реализующего IDispatchEx. А какой такой есть кокласс, задача которого реализовывать методы интерфейса IDispatchEx и больше ничего. Или же искать любой другой CLSID, который реализует IDispatchEx. Но так не рационально вообще. В инете опять же я что - то через яндекс инфу не нашел. При попытке создать объект с интерфейсом IDispatchEx в возвращаемом HRESULT - 0x80040154 "Класс не зарегистрирован". Так как же мне все - таки его создать? Ведь основная идея в том, что бы создать обект массива в COM - методе, который будет передан JScript скрипту. Данный вопрос поднимался на http://www.rsdn.ru/forum/com/1164089.all.aspx, а как практически это сделать никто не указал. |
| Автор: xvr 27.12.2010, 21:44 | ||
|
| Автор: log584 28.12.2010, 17:13 | ||||
Вот код:
Что нет может быть так? Обязательно ли реализовывать IActiveScriptSite?
|
| Автор: xvr 28.12.2010, 22:41 | ||||
| Интерпретатор не переведен в запущенное состояние (IActiveScript::SetScriptState(SCRIPTSTATE_STARTED)) Обязательно. Вот код инициализации JS интерпретатора (выдрано из рабочего проекта):
По поводу ParseScriptText - в 7 параметр надо передать SCRIPTTEXT_ISEXPRESSION (SCRIPTTEXT_ISVISIBLE там необязателен) Вот код для исполнения произвольной JS строки (Builder)
|
| Автор: log584 3.1.2011, 13:19 |
| Поздравляю всех с наступившим! Все что задумал получилось, спасибо. |
| Автор: nikolaynnov 19.12.2012, 17:50 | ||||
Может глупый вопрос: зачем "new VBArray"? Вроде работает просто:
Тогда вообще ax2js можно не использовать, а сразу писать:
Или есть какие-то подводные камни, и надо всегда использовать new VBArray()? |
| Автор: xvr 19.12.2012, 20:35 |
| Для того, что бы из SAFEARRAY сделать легальный JS объект (VBArray). Сам по себе SAFEARRAY в JS никак не может быть использован Именно для SAFEARRAY'ев? |
| Автор: nikolaynnov 20.12.2012, 10:48 | ||||||
Именно. Вот более подробный пример: В idl:
В cpp:
И в скрипте:
|
| Автор: xvr 20.12.2012, 13:24 |
| Значит доделали функциональность с какой то версии JS интерпретатора. Раньше такое не проходило (вроде) |