Поделиться через


Практическое руководство. Вызов событий, обрабатываемых приемником COM

Сведения о модели событий на основе делегатов, предоставляемой платформой .NET Framework, см. в разделе Обработка и вызов событий. Конкретные сведения, применимые к этой теме, см. в пункте Вызов события этого же раздела.

В .NET Framework для связи отправителя события (источника) с получателем события (приемником) используется система событий на основе делегатов. Если приемник является COM-клиентом, источник должен включать дополнительные элементы для имитации точек подключения. С этими изменениями COM-клиент может зарегистрировать свой интерфейс приемника событий традиционным способом, вызвав метод IConnectionPoint::Advise. (Visual Basic скрывает данные точек подключения, поэтому непосредственный вызов этих методов не требуется.)

Взаимодействие с приемником событий COM

  1. Определите интерфейс приемника событий в управляемом коде. Интерфейс может содержать подмножество событий, порождаемых управляемым классом. Имена методов интерфейса могут совпадать с именами событий.

  2. Примените атрибут ComSourceInterfacesAttribute для подключения интерфейса приемника событий к управляемому классу.

  3. Экспортируйте сборку, содержащую класс, в библиотеку типов. Для экспорта сборки используйте Tlbexp.exe (программа экспорта библиотек типов) или эквивалентную функцию API.

  4. Реализуйте интерфейс приемника событий в COM.

  5. Для COM- клиентов, принимающих события, реализуйте интерфейс приемника событий, определенный источником событий в соответствующей библиотеке типов. Затем используйте механизм точек подключения для связывания интерфейса приемника с источником событий.

Пример

В следующем примере показан управляемый сервер в качестве источника событий и COM-клиент в качестве приемника событий. Управляемый сервер объявляет интерфейс приемника событий ButtonEvents и связывает этот интерфейс с классом Button. Неуправляемый клиент создает экземпляр класса Button и реализует интерфейс приемника событий.

' Managed server (event source)
Option Explicit
Option Strict

Imports System
Imports System.Runtime.InteropServices

Namespace EventSource
    Public Delegate Sub ClickDelegate(x As Integer, y As Integer)
    Public Delegate Sub ResizeDelegate()
    Public Delegate Sub PulseDelegate()
   
    ' Step 1: Defines an event sink interface (ButtonEvents) to be
    ' implemented by the COM sink.
    <GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967"), _
    InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)> _
    Public Interface ButtonEvents
        Sub Click(x As Integer, y As Integer)
        Sub Resize()
        Sub Pulse()
    End Interface
   
    ' Step 2: Connects the event sink interface to a class 
    ' by passing the namespace and event sink interface
    ' ("EventSource.ButtonEvents, EventSrc").
    <ComSourceInterfaces(GetType(ButtonEvents))> _
    Public Class Button
        Public Event Click As ClickDelegate
        Public Event Resize As ResizeDelegate
        Public Event Pulse As PulseDelegate
      
      
        Public Sub CauseClickEvent(x As Integer, y As Integer)
            RaiseEvent Click(x, y)
        End Sub
      
        Public Sub CauseResizeEvent()
            RaiseEvent Resize()
        End Sub
      
        Public Sub CausePulse()
            RaiseEvent Pulse()
        End Sub
    End Class
End Namespace
using System;
using System.Runtime.InteropServices;
namespace EventSource
{
    public delegate void ClickDelegate(int x, int y);
    public delegate void ResizeDelegate();
    public delegate void PulseDelegate();
   
    // Step 1: Defines an event sink interface (ButtonEvents) to be     
    // implemented by the COM sink.
    [GuidAttribute("1A585C4D-3371-48dc-AF8A-AFFECC1B0967") ]
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
    public interface ButtonEvents
    {
        void Click(int x, int y);
        void Resize();
        void Pulse();
    }
    // Step 2: Connects the event sink interface to a class 
    // by passing the namespace and event sink interface
    // ("EventSource.ButtonEvents, EventSrc").
    [ComSourceInterfaces(typeof(ButtonEvents))]
    public class Button
    {
        public event ClickDelegate Click;
        public event ResizeDelegate Resize;
        public event PulseDelegate Pulse;
      
        public Button()
        {
        }
        public void CauseClickEvent(int x, int y)
        { 
            Click(x, y);
        }
        public void CauseResizeEvent()
        { 
            Resize();
        }
        public void CausePulse()
        {
            Pulse();
        }
    }
}
' COM client (event sink)
' This Visual Basic 6.0 client creates an instance of the Button class and 
' implements the event sink interface. The WithEvents directive 
' registers the sink interface pointer with the source.
Public WithEvents myButton As Button

Private Sub Class_Initialize()
    Dim o As Object
    Set o = New Button
    Set myButton = o
End Sub
' Events and methods are matched by name and signature.
Private Sub myButton_Click(ByVal x As Long, ByVal y As Long)
    MsgBox "Click event"
End Sub

Private Sub myButton_Resize()
    MsgBox "Resize event"
End Sub

Private Sub myButton_Pulse()
End Sub

См. также

Задачи

Практическое руководство. Обработка событий, вызванных COM-источником

Ссылки

ComSourceInterfacesAttribute

Основные понятия

Предоставление COM-клиентам доступа к компонентам .NET Framework

Другие ресурсы

Управляемые и неуправляемые события