Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
IDispEventImpl şablon sınıfı, ATL sınıfınızdaki bağlantı noktası havuzları için destek sağlamak için kullanılabilir. Bağlantı noktası havuzu, sınıfınızın dış COM nesnelerinden tetiklenen olayları işlemesine olanak tanır. Bu bağlantı noktası havuzları, sınıfınız tarafından sağlanan bir olay havuzu eşlemesiyle eşlenir.
Sınıfınız için bir bağlantı noktası havuzu düzgün bir şekilde uygulamak için aşağıdaki adımların tamamlanması gerekir:
Her dış nesne için tür kitaplıklarını içeri aktarma
Arabirimleri bildirme
IDispEventImplOlay havuzu eşlemesi bildirme
Bağlantı noktalarını önerin ve önerisini kaldırın
Bağlantı noktası havuzu uygulamayla ilgili adımların tümü yalnızca sınıfınızın üst bilgi dosyasını (.h) değiştirerek gerçekleştirilir.
Tür Kitaplıklarını İçeri Aktarma
Olaylarını işlemek istediğiniz her dış nesne için tür kitaplığını içeri aktarmanız gerekir. Bu adım, işlenebilen olayları tanımlar ve olay havuzu eşlemesi bildirilirken kullanılan bilgileri sağlar.
bunu gerçekleştirmek için #import yönergesi kullanılabilir. Destekleyeceğiniz her dağıtım arabirimi için gerekli #import yönerge satırlarını sınıfınızın üst bilgi dosyasına (.h) ekleyin.
Aşağıdaki örnek bir dış COM sunucusunun () tür kitaplığını içeriMSCAL.Calendar.7 aktarır:
#import "PROGID:MSCAL.Calendar.7" no_namespace, raw_interfaces_only
Not
Desteklediğiniz her dış tür kitaplığı için ayrı #import bir deyiminiz olmalıdır.
IDispEventImpl Arabirimlerini Bildirme
Artık her dağıtım arabiriminin tür kitaplıklarını içeri aktardığınıza göre, her dış dağıtım arabirimi için ayrı IDispEventImpl arabirimler bildirmeniz gerekir. Her dış nesne için bir IDispEventImpl arabirim bildirimi ekleyerek sınıfınızın bildirimini değiştirin. Parametreler hakkında daha fazla bilgi için bkz . IDispEventImpl.
Aşağıdaki kod, sınıfı DCalendarEventstarafından uygulanan COM nesnesi için CMyCompositCtrl2 arabirimi için iki bağlantı noktası havuzu bildirir:
public IDispEventImpl<IDC_CALENDAR1, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>,
public IDispEventImpl<IDC_CALENDAR2, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>
Olay Havuzu Eşlemesi Bildirme
Olay bildirimlerinin doğru işlev tarafından işlenmesi için sınıfınızın her olayı doğru işleyicisine yönlendirmesi gerekir. Bu, bir olay havuzu haritası bildirilerek elde edilir.
ATL, bu eşlemeyi kolaylaştıran BEGIN_SINK_MAP, END_SINK_MAP ve SINK_ENTRY_EX çeşitli makrolar sağlar. Standart biçim aşağıdaki gibidir:
BEGIN_SINK_MAP(comClass)
SINK_ENTRY_EX(id, iid, dispid, func)
. . . //additional external event entries
END_SINK_MAP()
Aşağıdaki örnek, iki olay işleyicisi ile bir olay havuzu eşlemesi bildirir:
BEGIN_SINK_MAP(CMyCompositCtrl2)
//Make sure the Event Handlers have __stdcall calling convention
SINK_ENTRY_EX(IDC_CALENDAR1, __uuidof(DCalendarEvents), DISPID_CLICK,
&CMyCompositCtrl2::ClickCalendar1)
SINK_ENTRY_EX(IDC_CALENDAR2, __uuidof(DCalendarEvents), DISPID_CLICK,
&CMyCompositCtrl2::ClickCalendar2)
END_SINK_MAP()
Uygulama neredeyse tamamlandı. Son adım, dış arabirimlerin tavsiye ve unadvising ile ilgilidir.
IDispEventImpl Arabirimlerini Ekleme ve Ekleme
Son adım, tüm bağlantı noktalarını uygun zamanlarda önerecek (veya bağlantıyı kaldıracak) bir yöntem uygulamaktır. Dış istemciler ve nesneniz arasındaki iletişim gerçekleşmeden önce bu danışmanlık yapılmalıdır. Nesneniz görünür hale gelmeden önce, nesneniz tarafından desteklenen her dış dağıtım arabirimi giden arabirimler için sorgulanır. Nesneden olayları işlemek için bir bağlantı kurulur ve giden arabirime başvuru kullanılır. Bu yordam "danışmanlık" olarak adlandırılır.
Nesneniz dış arabirimlerle tamamlandıktan sonra giden arabirimlere sınıfınız tarafından artık kullanılmadıkları bildirilmelidir. Bu işleme "unadvising" adı verilir.
COM nesnelerinin benzersiz yapısı nedeniyle bu yordam, uygulamalar arasında ayrıntılı olarak ve yürütmede değişiklik gösterir. Bu ayrıntılar bu konunun kapsamı dışındadır ve ele alınmaz.