|
|
|
log584 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 2.1.2010 Репутация: нет Всего: нет |
Есть JScript - скрипт, запускаемый под IIS 5.0. В скрипте создается объект, реализуемый в проекте ATL на VSC++ 2008.
Как видно, созданный в скрипте объект типа Array присваивается свойству. Дальше. Ловлю данный объект на стороне сервера:
vParam->vt = 9 = VT_DISPATCH. А вот что это за IDispatch конкретно я не знаю. Соответственно и работать с ним далее не получается. В этом собственно, и весь вопрос. Как узнать что это за тип, что бы знать его методы. В инете информации о интерфейсах объекта JScript Array я не нашел, пролазил два дня. Помогите пожалуйста. |
||||
|
|||||
jonie |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 5 Всего: 118 |
© отсюда: http://stackoverflow.com/questions/1926723...4345682#4345682 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
xvr |
|
||||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Array вестимо
Помогаю - http://msdn.microsoft.com/en-us/library/k4...v=VS.85%29.aspx А индексировать его можно попробовать через DISPID_VALUE (с параметром) Добавлено через 11 минут и 35 секунд Update - данные, помещенные в массив становятся доступны по имени, совпадающим с числом:
|
||||
|
|||||
log584 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 2.1.2010 Репутация: нет Всего: нет |
Да понятно, что не FileSystemObject. С объектом JScript Array я уже давно ознакомился в MSDN на локальной машине. xvr, на странице, в которую ты указал, описывается именно объект, используемый на стороне клиента автоматизации, а вот какой интерфейс использовать для доступа к методам кокласса данного объекта, на стороне C++, реализации COM сервера? Вот, может быть я изначально неточно сформулировал вопрос, извините. jonie, по - моему, года два назад у меня уже была подобная ситуация ( опять - же по - моему с помощью VBArray я и выкручивался), ладно, я попробую передавать COM - серверу объект VBArray, должно получиться, но все равно - это изврат. Изначально вопрос стоял о том, что за интерфейс реализован коклассом объекта Array, передаваемого из JScript на сторону C++? С тем, чтобы посмотреть его документацию и использовать его (на стороне C++ COM - сервера). Вот это будет самый верный путь. |
|||
|
||||
xvr |
|
||||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Полный список реализуемых интерфейсов был на строках 7-9 в листинге моем сообщении Угу. К сожалению стандартный метод передачи массивов в ActiveX (SAFEARRAY) интерпретатор JS не поддерживает
|
||||
|
|||||
log584 |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 2.1.2010 Репутация: нет Всего: нет |
Тот же самый - это какой? (Какой интерфейс для C++?) Еще раз вопрос конкретно, какой интерфейс, его наименование, заголовочный файл из MSDN для C++? Ну пускай не из MSDN...
Какие такие методы и пропертя мне дают IUnknown, IDispatch (или интерфейсы классов), чтобы я смог вызывать конкретные методы кокласса для данного интерфейса объека Array? Да есть у меня IDispatch, который ни о чем еще не гововорит. IUnknown, IDispatch сами по себе не предназначены для получения информации о методах интерфейса. Да, еще, не реализован у моего объекта JScript Array, передаваемого на сторону C++ сервера интерфейс IDispatchEx!!! У объекта, переданного на сторону сервера, при попытке инстанциировать интерфейс типа IDispatchEx в HRESULT возвращается E_NOINTERFACE. ???????? И еще, скорей всего, как я понял Делфинарий?
А вот это ценная информация. И все равно, что за объект я получаю на стороне сервера? Может полный проект дать? |
||||||
|
|||||||
xvr |
|
||||||||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
IDispatch::GetIDSOfNames & IDispatch::Invoke
Вы хотели сказать - клиенту на С++? Т.к. сервер находится как раз внутри JS интерпретатора
IDispatch. НЕ DUAL, ПРОСТОЙ IDispatch. Вот, кусок из реального проекта:
В качестве имени используйте строку с индексом, (для индексации индексом 5 делайте так):
|
||||||||
|
|||||||||
log584 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 2.1.2010 Репутация: нет Всего: нет |
Спасибо, дошло. Но все равно это не решение. Какой объект, в таком случае я должен создать на стороне C++ сервера, чтобы он, попав на сторону скрипта, там в скрипте имел тип Array?
|
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
В JS все объекты равноправны. А Array - это всего лишь один из встроенных объектов. Так что можно сделать IDispatch, который будет реализовывать методы Array, такой объект будет практически неотличим от родного JS Array'я. Полнофункциональный JS Array можно создать только внутри самого интерпретатора JS. Например попросив интерпретатор вычислить выражение new Array() или просто ([]), в результате будет возвращен VARIANT, содержащий IDispatch настоящего JS Array'я. А дальше его можно наполнять данными (через IDispatchEx::GetDispID c fdexNameEnsure) |
|||
|
||||
log584 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 2.1.2010 Репутация: нет Всего: нет |
Ладно, с этим разобрался. Спасибо большое за терпение. Если появятся дополнительные, надеюсь можно будет обратиться за помощью?
Это сообщение отредактировал(а) log584 - 24.12.2010, 22:20 |
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
||||
|
||||
log584 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 2.1.2010 Репутация: нет Всего: нет |
Опять проблема. Если я правильно понял, то динамический создать элементы объекта массива на стороне COM - метода в виде индексированных свойств объекта можно только с помощью IDispatchEx. Если так, то нужно знать CLSID кокласса, реализующего IDispatchEx. А какой такой есть кокласс, задача которого реализовывать методы интерфейса IDispatchEx и больше ничего.
Или же искать любой другой CLSID, который реализует IDispatchEx. Но так не рационально вообще. В инете опять же я что - то через яндекс инфу не нашел. При попытке создать объект с интерфейсом IDispatchEx в возвращаемом HRESULT - 0x80040154 "Класс не зарегистрирован". Так как же мне все - таки его создать? Ведь основная идея в том, что бы создать обект массива в COM - методе, который будет передан JScript скрипту. Данный вопрос поднимался на rsnd, а как практически это сделать никто не указал. Это сообщение отредактировал(а) log584 - 25.12.2010, 22:09 |
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Не понял - вам нужно получить IDispatchEx или создать? Если первое, то банальный IDispatch::QueryInterface(IID_DispatchEx,...). Если второе - то либо поручить это JS интерпретатору (через IActiveScriptParse::ParseScriptText("new Array()") ), либо имплементировать самому (с нуля) |
|||
|
||||
log584 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 2.1.2010 Репутация: нет Всего: нет |
Вот код:
Что нет может быть так? Обязательно ли реализовывать IActiveScriptSite?
Это сообщение отредактировал(а) log584 - 28.12.2010, 17:24 |
||||
|
|||||
xvr |
|
||||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Интерпретатор не переведен в запущенное состояние (IActiveScript::SetScriptState(SCRIPTSTATE_STARTED))
Обязательно. Вот код инициализации JS интерпретатора (выдрано из рабочего проекта):
По поводу ParseScriptText - в 7 параметр надо передать SCRIPTTEXT_ISEXPRESSION (SCRIPTTEXT_ISVISIBLE там необязателен) Вот код для исполнения произвольной JS строки (Builder)
|
||||
|
|||||
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |