Почему IE не слушает события ActiveX? - PullRequest
1 голос
/ 11 июля 2011

Я поместил элемент управления ActiveX на страницу HTML с помощью метода longrun, который должен запускать события, обрабатываемые IE.

Они не запускаются, потому что m_vec.GetSize() == 0, это означает, что IE не подключается к моему ActiveX.

Сайт является локальным, он находится в надежных сайтах, а уровень безопасности установлен на минимум.

HTML

 <object id="myObj" name="myObj" ...>                    
 </object>   

   <script type="text/javascript" for="myObj" event="CallbackMethod(...)" language="javascript">
        alert("hello!");
    </script>

IDL

[uuid(...), dual]
interface _IBasicEvents : IDispatch
{   
    [id(1)] HRESULT CallbackMethod(...);
};

[uuid(...)] 
coclass MyService
{       
    [default] interface IBasicInterface;        
    [default, source] dispinterface _IBasicEvents;
};

С ++ Список наследования:

class ATL_NO_VTABLE CMyService :
    public CComObjectRootEx<CComSingleThreadModel>, 
    public CComControl<CMyService>, 
    public CComCoClass<CMyService, &CLSID_MyService>,
    public IConnectionPointContainerImpl<CMyService>,       
    public IObjectWithSiteImpl<CMyService>,     
    public IPersistPropertyBagImpl<CMyService>, 
    public IObjectSafetyImpl<CMyService, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>,
    public IOleInPlaceObjectWindowlessImpl<CMyService>,
    public IOleObjectImpl<CMyService>,
    public IDispatchImpl<IBasicInterface, ...>,
    public CProxy_IScannerServiceEvents<CMyService>

COM_MAP

COM_INTERFACE_ENTRY(IBasicInterface)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY(IObjectWithSite)    
COM_INTERFACE_ENTRY(IOleObject) 
COM_INTERFACE_ENTRY(IObjectSafety)  
COM_INTERFACE_ENTRY(IPersistPropertyBag)    

CONNECTION_POINT_MAP

CONNECTION_POINT_ENTRY(__uuidof(_IBasicEvents))

CATEGORY_MAP

IMPLEMENTED_CATEGORY(CATID_SafeForScripting)
IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)

Что здесь не так?Почему IE не подключается к моему интерфейсу точки подключения?

Временное решение

Я отказался от игр с <script for event> и начал передавать функцию обратного вызова javascript в качестве параметра метода (тип IDispatch*)

1 Ответ

0 голосов
/ 08 сентября 2011

[uuid (...), двойной] интерфейс _IBasicСобытия: IDispatch

[по умолчанию, источник] dispinterface _IBasicEvents;

AFAIK IDL coclass должен ссылаться на интерфейс события, как вы делаете выше, но ваши _IBasicEvents не определены как dispainterface. Вместо этого это настоящий интерфейс, который не является правильным. Там должно быть:

[...] dispinterface _IBasicEvents {методы: ...};

...