Suppose I have a COM object which users can access via a call such as:
Set s = CreateObject("Server")
What I'd like to be able to do is allow the user to specify an event handler for the object, like so:
Function ServerEvent
MsgBox "Event handled"
End Function
s.OnDoSomething = ServerEvent
Is this possible and, if so, how do I expose this in my type library in C++ (specifically BCB 2007)?
I ended up following the technique described here.
This is how I did it just recently. Add an interface that implements IDispatch and a coclass for that interface to your IDL:
This is the declaration of the CServerEvents class:
The key here is the implementation of the IConnectionPointImpl and IConnectionPointContainerImpl interfaces and the connection point map. The definition of the OnServerEvent method looks like this:
You need to provide a way for your client to specify their handler for your events. You can do this with a dedicated method like "SetHandler" or something, but I prefer to make the handler an argument to the method that is called asynchronously. This way, the user only has to call one method:
Store the pointer to the IServerEvents, and then when you want to fire your event, just call the method:
As for the VB code, the syntax for dealing with events is a little different than what you suggested:
I hope this helps.
I'm a little hazy on the details, but maybe the link below might help:
http://msdn.microsoft.com/en-us/library/ms974564.aspx
It looks like your server object needs to implement
IProvideClassInfo
and then you callConnectObject
in your VBScript code. See also:http://blogs.msdn.com/ericlippert/archive/2005/02/15/373330.aspx