我正在构建一个小型的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。
我似乎无法理解为什么它不起作用。少了什么东西?如果问题不明确,我很抱歉,我得到的错误也不清楚,所以请问我,我会改进这个问题。
答案 0 :(得分:1)
我没有在您的代码中看到任何事件声明。应该是
public delegate void EvenHanderDelegate(string redirectUrl);
公共事件EnvenHanderDelegate OnClose;