Есть 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 куда рыть и что смотреть.
Здравствуйте, senon_evero, Вы писали:
_>Есть ActiveX написанный на с++ atl, _>... _>Если Activex зарегистрирован тогда obj.GetData() возвращает данные, если же сделать unreg выходит ошибка _>"Объект не поддерживает свойство или метод "GetData"" _>Подскажите plz куда рыть и что смотреть.
Как правило, ActiveX, написанный на с++ atl, реализует диспетчер интерфейса IDispatch через atl класс, которому требуется библиотека типов, причем зарегистрированная в Реестре.
Здравствуйте, Vi2, Вы писали:
Vi2>Как правило, ActiveX, написанный на с++ atl, реализует диспетчер интерфейса IDispatch через atl класс, которому требуется библиотека типов, причем зарегистрированная в Реестре.
не совсем верно. IDispatchImpl да работает через TLB но не использует при этом Реест. Регистрация TLB в Реестре нужна для "стандартного" маршалинга (который в случае inprocess отсутствует) и для discovery фунций праметров в языках типа Visual Basic
Здравствуйте, Плескатель Устены, Вы писали:
ПУ>не совсем верно. IDispatchImpl да работает через TLB но не использует при этом Реест. Регистрация TLB в Реестре нужна для "стандартного" маршалинга (который в случае inprocess отсутствует) и для discovery фунций праметров в языках типа Visual Basic
"var obj = ...; var data = obj.GetData();" не требует никакого "стандартного" маршалинга, потому что, кроме IDispatch, скрипт ничего не запрашивает, а уж для IDispatch система и так знает, как его маршаллить. TLB нужна обработчику методов IDispatch, чтобы распознавать имена и адресовать вызовы в виртуальные методы дуального интерфейса. А эту TLB IDispatchImpl берёт именно что из Реестра. Так что проблема в реализации интерфейса IDispatch в ATL.
Здравствуйте, 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 начинает хотеть реестр
Здравствуйте, Плескатель Устены, Вы писали:
ПУ>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 начинает хотеть реестр
Здравствуйте, Vi2, Вы писали:
Vi2>А зачем маршаллить dual интрефейс, если его никто не запрашивает?
так я про то и говорил в исходном сообщении TLB нужен для маршалинга а его тут и не будет.
хорошо исправляю фразу "TLB нужен для маршалинга дуального интерфеса, но маршилинга в случае inprocess не будет".
Vi2>Ну новых исходников у меня сейчас под рукой нет, а, ЕМНИП, в старых этого не было.
да действительно . похоже эта штука добавлена недавно.