IE не видит методы объекта.
От: senon_evero  
Дата: 27.09.12 15:15
Оценка:
Есть ActiveX написанный на с++ atl,
Добавляю на HTML страничку так:
<object classid="clsid:00000000-0000-0000-0000-77A0019E4429" id="activeX" CODEBASE="http://localhost/activex/activex.dll" width="0" height="0">
потом в JS:
function(){
var obj = document.getElementById("activeX");
var data = obj.GetData();
}

Если Activex зарегистрирован тогда obj.GetData() возвращает данные, если же сделать unreg выходит ошибка
"Объект не поддерживает свойство или метод "GetData""
Подскажите plz куда рыть и что смотреть.
Re: IE не видит методы объекта.
От: Vi2 Удмуртия http://www.adem.ru
Дата: 27.09.12 16:43
Оценка:
Здравствуйте, senon_evero, Вы писали:

_>Есть ActiveX написанный на с++ atl,

_>...
_>Если Activex зарегистрирован тогда obj.GetData() возвращает данные, если же сделать unreg выходит ошибка
_>"Объект не поддерживает свойство или метод "GetData""
_>Подскажите plz куда рыть и что смотреть.

Как правило, ActiveX, написанный на с++ atl, реализует диспетчер интерфейса IDispatch через atl класс, которому требуется библиотека типов, причем зарегистрированная в Реестре.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: IE не видит методы объекта.
От: Плескатель Устены  
Дата: 27.09.12 17:50
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Как правило, ActiveX, написанный на с++ atl, реализует диспетчер интерфейса IDispatch через atl класс, которому требуется библиотека типов, причем зарегистрированная в Реестре.


не совсем верно. IDispatchImpl да работает через TLB но не использует при этом Реест. Регистрация TLB в Реестре нужна для "стандартного" маршалинга (который в случае inprocess отсутствует) и для discovery фунций праметров в языках типа Visual Basic
Re[3]: IE не видит методы объекта.
От: Vi2 Удмуртия http://www.adem.ru
Дата: 27.09.12 18:19
Оценка:
Здравствуйте, Плескатель Устены, Вы писали:

ПУ>не совсем верно. IDispatchImpl да работает через TLB но не использует при этом Реест. Регистрация TLB в Реестре нужна для "стандартного" маршалинга (который в случае inprocess отсутствует) и для discovery фунций праметров в языках типа Visual Basic


"var obj = ...; var data = obj.GetData();" не требует никакого "стандартного" маршалинга, потому что, кроме IDispatch, скрипт ничего не запрашивает, а уж для IDispatch система и так знает, как его маршаллить. TLB нужна обработчику методов IDispatch, чтобы распознавать имена и адресовать вызовы в виртуальные методы дуального интерфейса. А эту TLB IDispatchImpl берёт именно что из Реестра. Так что проблема в реализации интерфейса IDispatch в ATL.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: IE не видит методы объекта.
От: Плескатель Устены  
Дата: 27.09.12 18:40
Оценка: 7 (1)
Здравствуйте, Vi2, Вы писали:

Vi2>"var obj = ...; var data = obj.GetData();" не требует никакого "стандартного" маршалинга, потому что, кроме IDispatch, скрипт ничего не запрашивает, а уж для IDispatch система и так знает, как его маршаллить.


ATL обычно генерирует еще и dual интрефейс, его система совсем не знает как маршаллить

Vi2>TLB нужна обработчику методов IDispatch, чтобы распознавать имена и адресовать вызовы в виртуальные методы дуального интерфейса. А эту TLB IDispatchImpl берёт именно что из Реестра.


Нет это не совсем так. Открываем atlcom.h ищем функцию CComTypeInfoHolder::GetTI(_In_ LCID lcid)
так вот если по дефолту Major == 0xFFFF && wMinor == 0xFFFF она делает LoadTypeLib (которая не требует реестра) на саму себя через GetModuleFileName
LoadRegTypeLib делается в противном случае

Vi2> Так что проблема в реализации интерфейса IDispatch в ATL.


скорее всего забыты те самые 0xFFFFб 0xFFFF
public IDispatchImpl<ICoolInterface, &IID_ICoolInterface, &LIBID_CoolLib, 0xFFFF, 0xFFFF>
стоит наверное какой нить 1, 0 изза чего ATL начинает хотеть реестр
Re[5]: IE не видит методы объекта.
От: Vi2 Удмуртия http://www.adem.ru
Дата: 27.09.12 19:05
Оценка:
Здравствуйте, Плескатель Устены, Вы писали:

ПУ>ATL обычно генерирует еще и dual интрефейс, его система совсем не знает как маршаллить


А зачем маршаллить dual интрефейс, если его никто не запрашивает?

ПУ>Нет это не совсем так. Открываем atlcom.h ищем функцию CComTypeInfoHolder::GetTI(_In_ LCID lcid)

ПУ>так вот если по дефолту Major == 0xFFFF && wMinor == 0xFFFF она делает LoadTypeLib (которая не требует реестра) на саму себя через GetModuleFileName
ПУ>LoadRegTypeLib делается в противном случае

Ну новых исходников у меня сейчас под рукой нет, а, ЕМНИП, в старых этого не было.

ПУ>скорее всего забыты те самые 0xFFFFб 0xFFFF

ПУ>public IDispatchImpl<ICoolInterface, &IID_ICoolInterface, &LIBID_CoolLib, 0xFFFF, 0xFFFF>
ПУ>стоит наверное какой нить 1, 0 изза чего ATL начинает хотеть реестр

Возможно.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[6]: IE не видит методы объекта.
От: Плескатель Устены  
Дата: 27.09.12 19:24
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>А зачем маршаллить dual интрефейс, если его никто не запрашивает?


так я про то и говорил в исходном сообщении TLB нужен для маршалинга а его тут и не будет.
хорошо исправляю фразу "TLB нужен для маршалинга дуального интерфеса, но маршилинга в случае inprocess не будет".

Vi2>Ну новых исходников у меня сейчас под рукой нет, а, ЕМНИП, в старых этого не было.


да действительно . похоже эта штука добавлена недавно.

https://bitbucket.org/axplus/share/src/e6719b28bd18/wtl/include/atl/atlcom.h <-- старая
vs
http://webcache.googleusercontent.com/search?q=cache:gInneEQd428J:www.nostuh.com/doug/swipe/swipey/tools/opos/OposCCOSource-1_13_001/Common/ATL/atlcom.h+&amp;cd=10&amp;hl=en&amp;ct=clnk&amp;gl=us <-- новая
Re[7]: IE не видит методы объекта.
От: senon_evero  
Дата: 01.10.12 16:39
Оценка:
Здравствуйте, Плескатель Устены, Вы писали:

ПУ>Здравствуйте, Vi2, Вы писали:


Vi2>>А зачем маршаллить dual интрефейс, если его никто не запрашивает?


ПУ>так я про то и говорил в исходном сообщении TLB нужен для маршалинга а его тут и не будет.

ПУ>хорошо исправляю фразу "TLB нужен для маршалинга дуального интерфеса, но маршилинга в случае inprocess не будет".

Vi2>>Ну новых исходников у меня сейчас под рукой нет, а, ЕМНИП, в старых этого не было.


ПУ>да действительно . похоже эта штука добавлена недавно.


ПУ>https://bitbucket.org/axplus/share/src/e6719b28bd18/wtl/include/atl/atlcom.h <-- старая

ПУ>vs
ПУ>http://webcache.googleusercontent.com/search?q=cache:gInneEQd428J:www.nostuh.com/doug/swipe/swipey/tools/opos/OposCCOSource-1_13_001/Common/ATL/atlcom.h+&amp;cd=10&amp;hl=en&amp;ct=clnk&amp;gl=us <-- новая

всем спасибо за размышления, дело было в отсутствии интерфейса IObjectSafetyImpl.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.