Events 向my COM对象的VBScript用户公开事件处理程序

Events 向my COM对象的VBScript用户公开事件处理程序,events,com,vbscript,c++builder,Events,Com,Vbscript,C++builder,假设我有一个COM对象,用户可以通过以下调用访问该对象: Set s = CreateObject("Server") 我希望能够允许用户为对象指定事件处理程序,如下所示: Function ServerEvent MsgBox "Event handled" End Function s.OnDoSomething = ServerEvent 这是可能的吗?如果是这样,我如何将它暴露在C++中的我的类型库中(具体地说是BCB 2007)? < P>我对细节有点模糊,但是下面的链

假设我有一个COM对象,用户可以通过以下调用访问该对象:

Set s = CreateObject("Server")
我希望能够允许用户为对象指定事件处理程序,如下所示:

Function ServerEvent

   MsgBox "Event handled"

End Function

s.OnDoSomething = ServerEvent

这是可能的吗?如果是这样,我如何将它暴露在C++中的我的类型库中(具体地说是BCB 2007)?

< P>我对细节有点模糊,但是下面的链接可能有帮助:

看起来您的服务器对象需要实现
IProvideClassInfo
,然后在VBScript代码中调用
ConnectObject
。另见:


我最近就是这样做的。将实现IDispatch的接口和该接口的coclass添加到IDL:

[
    object,
    uuid(6EDA5438-0915-4183-841D-D3F0AEDFA466),
    nonextensible,
    oleautomation,
    pointer_default(unique)
]
interface IServerEvents : IDispatch
{
    [id(1)]
    HRESULT OnServerEvent();
}

//...

[
    uuid(FA8F24B3-1751-4D44-8258-D649B6529494),
]
coclass ServerEvents
{
    [default] interface IServerEvents;
    [default, source] dispinterface IServerEvents;
};
这是CServerEvents类的声明:

class ATL_NO_VTABLE CServerEvents :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CServerEvents, &CLSID_ServerEvents>,
    public IDispatchImpl<IServerEvents, &IID_IServerEvents , &LIBID_YourLibrary, -1, -1>,
    public IConnectionPointContainerImpl<CServerEvents>,
    public IConnectionPointImpl<CServerEvents,&__uuidof(IServerEvents)>
{
public:
    CServerEvents()
    {
    }

    // ...

BEGIN_COM_MAP(CServerEvents)
    COM_INTERFACE_ENTRY(IServerEvents)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IConnectionPointContainer)
END_COM_MAP()

BEGIN_CONNECTION_POINT_MAP(CServerEvents)
    CONNECTION_POINT_ENTRY(__uuidof(IServerEvents))
END_CONNECTION_POINT_MAP()

    // ..

    // IServerEvents
    STDMETHOD(OnServerEvent)();

private:
    CRITICAL_SECTION m_csLock;        
};
存储指向IServEvents的指针,然后当您想要触发事件时,只需调用以下方法:

m_pCallback->OnServerEvent();
至于VB代码,处理事件的语法与您建议的略有不同:

Private m_server As Server
Private WithEvents m_serverEvents As ServerEvents

Private Sub MainMethod()
    Set s = CreateObject("Server")
    Set m_serverEvents = New ServerEvents

    Call m_searchService.DoSomethingAsynchronous(m_serverEvents)
End Sub

Private Sub m_serverEvents_OnServerEvent()
    MsgBox "Event handled"
End Sub

我希望这会有所帮助。

我最终遵循了所描述的技术。

您提供的代码是VB语法,而不是VBScript。“As”关键字和“WithEvents”在VBScript中不可用。@1800信息,您是对的。我已经使用了VB和VBScript,但是我已经很久没有用VBScript做任何事情了。我忘记或不知道这一特殊的差别。JeffHyman,提供的解决方案是C++。现在我有一个类似的需求,但是对于通过C#开发的ActiveX COM(我们有这方面的源代码)。你知道C#/.Net世界也有类似的方法吗?这可能是最好的答案,因为现在链接似乎已经死了。
m_pCallback->OnServerEvent();
Private m_server As Server
Private WithEvents m_serverEvents As ServerEvents

Private Sub MainMethod()
    Set s = CreateObject("Server")
    Set m_serverEvents = New ServerEvents

    Call m_searchService.DoSomethingAsynchronous(m_serverEvents)
End Sub

Private Sub m_serverEvents_OnServerEvent()
    MsgBox "Event handled"
End Sub