вызов функции javascript из activex

Я создаю небольшой элемент управления ActiveX. Я понял, что activex не может напрямую вызывать функцию javascript, но должен работать через события. Поэтому я создал событие, скопированное из образца кода из codeproject.

Кажется, что событие работает только при определенных обстоятельствах: оно работает, когда вызывается функция javascript, которая немедленно вызывает событие. Это не работает, когда моя функция javascript вызывает метод activex, который выполняет долгую операцию и только после этого вызывает событие, вот пример того, что я имею в виду:

Событие Activex:

[Guid("68BD4E0D-D7BC-4cf6-BEB7-CAB950161E79")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ControlEvents
{
    //Add a DispIdAttribute to any members in the source interface to specify the COM DispId.
    [DispId(0x60020001)]
    void OnClose(string redirectUrl); //This method will be visible from JS
}

Пример звонка, который работает:

    [ComVisible(true)]


public void Close()
    {
        if (OnClose != null)
        {
            OnClose("my test"); //Calling event that will be catched in JS
        }
        else
        {
            MessageBox.Show("No Event Attached"); //If no events are attached send message.
        }
    }

Пример неудачного вызова:

[ComVisible(true)]
        public void Open()
        {
            try
            {
                Start();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

С помощью функции Start вызывает очень длинный метод, который, в свою очередь, вызывает события каждые несколько минут и отправляет информацию обратно в javascript.

Кажется, я не понимаю, почему это не сработает. Чего не хватает? Прошу прощения, если вопрос не ясен, ошибка, которую я получаю, тоже непонятна, поэтому просто спросите, и я уточню вопрос.


person vondip    schedule 07.08.2009    source источник


Ответы (1)


Я не вижу объявления события в вашем коде. Что-то должно быть

публичный делегат void EvenHanderDelegate (строка redirectUrl);

публичное событие EnvenHanderDelegate OnClose;

person dcool    schedule 11.03.2010