Когда я делаю урок для прослушивания других событий, подобных этому
Private WithEvents myClass As eventEmitter
Private Sub myClass_myEvent()
'[...Handle Event]
End Sub
, а затем в myClass
Public Event myEvent
Sub DoStuff()
RaiseEvent myEvent
End Sub
Какие шаги происходят и какие вещи требуютсяпод капотом для VBA превратить этот оператор RaiseEvent
в вызов подпрограммы обработчика событий myClass_myEvent
?
Я знаю, как обрабатывать и вызывать события в VBA,но я до сих пор точно не знаю, что это такое и как они работают.
Я прочитал обрывки о IDispatch
, я попытался разобраться, как VB.Net
обрабатывает их, поэтому я могупосмотрите, что весь синтаксис обработчика ObjectType_EventName()
, используемый в VBA, скрывает много.
Я предполагаю, что под капотом события, вероятно, работают подобно очередям сообщений (за исключением объектов вместоокна), потому что они, кажется, строят таким же образом.Но, возможно, они больше похожи на обычные стеки вызовов - в этом случае Event знает, что его слушает, и просто помещает вызовы функций в стек вызовов, связанный с этими объектами слушателя.Тот факт, что только классы могут вызывать и обрабатывать события в VBA, указывает на то, что существует некоторый объем памяти / интерфейса, связанный с интерпретацией событий, который должен присутствовать во всех объектах VBA, так что это, вероятно, связано с реализацией COM в VBA в некотором роде..
Но это примерно столько, сколько я могу выработать, и я недостаточно знаком с темами, чтобы иметь возможность больше гуглить для себя, поэтому остается вопрос: как события работают под капотом?