亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > C++ > 正文

深入解析C++程序中激發(fā)事件和COM中的事件處理

2020-05-23 14:08:55
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了深入解析C++程序中激發(fā)事件和COM中的事件處理,是C++事件操作的基礎(chǔ),需要的朋友可以參考下
 

本機(jī) C++ 中的事件處理
在處理本機(jī) C ++ 事件時(shí),您分別使用 event_source 和 event_receiver 特性設(shè)置事件源和事件接收器,并指定 type=native。這些特性允許應(yīng)用它們的類在本機(jī)的非 COM 上下文中激發(fā)和處理事件。
聲明事件
在事件源類中,對(duì)一個(gè)方法聲明使用 __event關(guān)鍵字可將該方法聲明為事件。請(qǐng)確保聲明該方法,但不要定義它;這樣做會(huì)產(chǎn)生編譯器錯(cuò)誤,因?yàn)閷⒃摲椒ㄞD(zhuǎn)換為事件時(shí)編譯器會(huì)隱式定義它。本機(jī)事件可以是帶有零個(gè)或多個(gè)參數(shù)的方法。返回類型可以是 void 或任何整型。
定義事件處理程序
在事件接收器類中,可定義事件處理程序,這些處理程序是具有與它們將處理的事件匹配的簽名(返回類型、調(diào)用約定和參數(shù))的方法。
將事件處理程序掛鉤到事件
同樣在事件接收器類中,可使用內(nèi)部函數(shù) __hook 將事件與事件處理程序關(guān)聯(lián),并可使用 __unhook 取消事件與事件處理程序的關(guān)聯(lián)。您可將多個(gè)事件掛鉤到一個(gè)事件處理程序,或?qū)⒍鄠€(gè)事件處理程序掛鉤到一個(gè)事件。
激發(fā)事件
若要激發(fā)事件,只需調(diào)用聲明為事件源類中的事件的方法即可。如果處理程序已掛鉤到事件,則將調(diào)用處理程序。
本機(jī) C++ 事件代碼
以下示例演示如何在本機(jī) C++ 中激發(fā)事件。若要編譯并運(yùn)行此示例,請(qǐng)參考代碼中的注釋。
示例代碼

// evh_native.cpp#include <stdio.h>[event_source(native)]class CSource {public:  __event void MyEvent(int nValue);};[event_receiver(native)]class CReceiver {public:  void MyHandler1(int nValue) {   printf_s("MyHandler1 was called with value %d./n", nValue);  }  void MyHandler2(int nValue) {   printf_s("MyHandler2 was called with value %d./n", nValue);  }  void hookEvent(CSource* pSource) {   __hook(&CSource::MyEvent, pSource, &CReceiver::MyHandler1);   __hook(&CSource::MyEvent, pSource, &CReceiver::MyHandler2);  }  void unhookEvent(CSource* pSource) {   __unhook(&CSource::MyEvent, pSource, &CReceiver::MyHandler1);   __unhook(&CSource::MyEvent, pSource, &CReceiver::MyHandler2);  }};int main() {  CSource source;  CReceiver receiver;  receiver.hookEvent(&source);  __raise source.MyEvent(123);  receiver.unhookEvent(&source);}

輸出:

MyHandler2 was called with value 123.MyHandler1 was called with value 123.

COM 中的事件處理
在 COM 事件處理中,您使用 event_source 和 event_receiver 特性分別設(shè)置事件源和事件接收器,并指定 type=com。這些特性為自定義接口、調(diào)度接口和雙重接口注入相應(yīng)的代碼,從而使這些接口能夠應(yīng)用到的類激發(fā)事件并通過(guò) COM 連接點(diǎn)處理事件。
聲明事件
在事件源類中,在接口聲明上使用 __event 關(guān)鍵字以將該接口的方法聲明為事件。當(dāng)您將該接口的事件作為接口方法調(diào)用時(shí),將激發(fā)這些事件。事件接口上的方法可以有零個(gè)或多個(gè)參數(shù)(應(yīng)全是 in 參數(shù))。返回類型可以是 void 或任何整型。
定義事件處理程序
在事件接收器類中,可定義事件處理程序,這些處理程序是具有與它們將處理的事件匹配的簽名(返回類型、調(diào)用約定和參數(shù))的方法。對(duì)于 COM 事件,調(diào)用約定不必匹配;有關(guān)詳細(xì)信息,請(qǐng)參閱下文中的依賴于布局的 COM 事件。
將事件處理程序掛鉤到事件
同樣在事件接收器類中,可使用內(nèi)部函數(shù) __hook 將事件與事件處理程序關(guān)聯(lián),并可使用 __unhook 取消事件與事件處理程序的關(guān)聯(lián)。您可將多個(gè)事件掛鉤到一個(gè)事件處理程序,或?qū)⒍鄠€(gè)事件處理程序掛鉤到一個(gè)事件。
注意
通常,有兩種方法使 COM 事件接收器能夠訪問(wèn)事件源接口定義。第一種是共享公共頭文件,如下所示。第二種是將 #import 與 embedded_idl 導(dǎo)入限定符結(jié)合使用,以便讓事件源類型庫(kù)寫入到保留了特性生成的代碼的 .tlh 文件。
激發(fā)事件
若要激發(fā)事件,只需調(diào)用在事件源類中使用 __event 關(guān)鍵字聲明的接口中的方法。如果處理程序已掛鉤到事件,則將調(diào)用處理程序。
COM 事件代碼
下面的示例演示如何在 COM 類中激發(fā)事件。若要編譯并運(yùn)行此示例,請(qǐng)參考代碼中的注釋。

// evh_server.h#pragma once[ dual, uuid("00000000-0000-0000-0000-000000000001") ]__interface IEvents {  [id(1)] HRESULT MyEvent([in] int value);};[ dual, uuid("00000000-0000-0000-0000-000000000002") ]__interface IEventSource {  [id(1)] HRESULT FireEvent();};class DECLSPEC_UUID("530DF3AD-6936-3214-A83B-27B63C7997C4") CSource;

接著是服務(wù)器:

// evh_server.cpp// compile with: /LD// post-build command: Regsvr32.exe /s evh_server.dll#define _ATL_ATTRIBUTES 1#include <atlbase.h>#include <atlcom.h>#include "evh_server.h"[ module(dll, name="EventSource", uuid="6E46B59E-89C3-4c15-A6D8-B8A1CEC98830") ];[coclass, event_source(com), uuid("530DF3AD-6936-3214-A83B-27B63C7997C4")]class CSource : public IEventSource {public:  __event __interface IEvents;   HRESULT FireEvent() {   __raise MyEvent(123);   return S_OK;  }};

再然后是客戶端:

// evh_client.cpp// compile with: /link /OPT:NOREF#define _ATL_ATTRIBUTES 1#include <atlbase.h>#include <atlcom.h>#include <stdio.h>#include "evh_server.h"[ module(name="EventReceiver") ];[ event_receiver(com) ]class CReceiver {public:  HRESULT MyHandler1(int nValue) {   printf_s("MyHandler1 was called with value %d./n", nValue);   return S_OK;  }  HRESULT MyHandler2(int nValue) {   printf_s("MyHandler2 was called with value %d./n", nValue);   return S_OK;  }  void HookEvent(IEventSource* pSource) {   __hook(&IEvents::MyEvent, pSource, &CReceiver::MyHandler1);   __hook(&IEvents::MyEvent, pSource, &CReceiver::MyHandler2);  }  void UnhookEvent(IEventSource* pSource) {   __unhook(&IEvents::MyEvent, pSource, &CReceiver::MyHandler1);   __unhook(&IEvents::MyEvent, pSource, &CReceiver::MyHandler2);  }};int main() {  // Create COM object  CoInitialize(NULL);  {   IEventSource* pSource = 0;   HRESULT hr = CoCreateInstance(__uuidof(CSource), NULL,     CLSCTX_ALL, __uuidof(IEventSource), (void **) &pSource);   if (FAILED(hr)) {     return -1;   }   // Create receiver and fire event   CReceiver receiver;   receiver.HookEvent(pSource);   pSource->FireEvent();   receiver.UnhookEvent(pSource);  }  CoUninitialize();  return 0;}

輸出

MyHandler1 was called with value 123.MyHandler2 was called with value 123.

依賴于布局的 COM 事件
布局依賴性只是 COM 編程中的一個(gè)問(wèn)題。在本機(jī)和托管事件處理中,處理程序的簽名(返回類型、調(diào)用約定和參數(shù))必須與其事件匹配,但處理程序的名稱不必與其事件匹配。
但是,在 COM 事件處理中,如果將 event_receiver 的 layout_dependent 參數(shù)設(shè)置為 true,則將強(qiáng)制名稱和簽名匹配。這意味著事件接收器中處理程序的名稱和簽名必須與處理程序?qū)煦^到的事件的名稱和簽名完全匹配。
當(dāng) layout_dependent 設(shè)置為 false 時(shí),激發(fā)事件方法與掛鉤方法(其委托)之間的調(diào)用約定和存儲(chǔ)類(虛擬、靜態(tài)等)可以混合和匹配。將 layout_dependent 設(shè)置為 true 效率會(huì)稍微高一點(diǎn)。
例如,假設(shè) IEventSource 定義為具有下列方法:

[id(1)] HRESULT MyEvent1([in] int value);[id(2)] HRESULT MyEvent2([in] int value);

假定事件源具有以下形式:

[coclass, event_source(com)]class CSource : public IEventSource {public:  __event __interface IEvents;  HRESULT FireEvent() {   MyEvent1(123);   MyEvent2(123);   return S_OK;  }};

則在事件接收器中,掛鉤到 IEventSource 中的方法的任何處理程序必須與其名稱和簽名匹配,如下所示:

[coclass, event_receiver(com, true)]class CReceiver {public:  HRESULT MyEvent1(int nValue) { // name and signature matches MyEvent1   ...  }  HRESULT MyEvent2(E c, char* pc) { // signature doesn't match MyEvent2   ...  }  HRESULT MyHandler1(int nValue) { // name doesn't match MyEvent1 (or 2)   ...  }  void HookEvent(IEventSource* pSource) {   __hook(IFace, pSource); // Hooks up all name-matched events                 // under layout_dependent = true   __hook(&IFace::MyEvent1, pSource, &CReceive::MyEvent1);  // valid   __hook(&IFace::MyEvent2, pSource, &CSink::MyEvent2);  // not valid   __hook(&IFace::MyEvent1, pSource, &CSink:: MyHandler1); // not valid  }};


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
91探花福利精品国产自产在线| 高清国产免费| 日本1区2区3区视频| 精品熟女一区二区三区| 青青青青在线视频| 2023国产精品| 一级黄色大片网站| 国产精品一二| 欧美日韩一区二区三区不卡视频| 懂色av粉嫩av蜜臀av一区二区三区| 亚洲小视频在线播放| 精品日韩在线播放| 中文字幕第17页| 欧美精选一区二区| 日本动漫理论片在线观看网站| 亚洲一区二区三区四区av| 情se视频网在线观看| 直接在线观看的三级网址| 韩国精品美女www爽爽爽视频| 国产亚洲一本大道中文在线| 欧美老女人bb| 欧美a级网站| 精品视频vs精品视频| 国产精品亚洲第一区在线暖暖韩国| 国产精品拍拍拍| 欧美日韩三级电影在线| 一本色道婷婷久久欧美| 日本一区二区三区电影免费观看| 国产精品久久在线| 欧美另类色图| 无码任你躁久久久久久老妇| 成人av资源电影网站| 中文字幕日韩一区二区三区| 成人午夜电影网站| 2017天天干夜夜操| 国产一区影院| 日韩精品乱码av一区二区| 自慰无码一区二区三区| 精品少妇人妻av免费久久洗澡| 亚洲aaa视频| 中文字幕不卡在线播放| 精品免费国产一区二区三区四区| 性欧美69式xxxxx| 一区二区三区中文字幕电影| 精品在线观看一区二区| 91极品身材尤物theporn| 成年女人免费又黄又爽视频| 国产精品99一区二区三| 99欧美视频| 秋霞在线观看一区二区三区| 欧美午夜免费| 超碰aⅴ人人做人人爽欧美| 亚洲成av人片一区二区三区| 国产成人精品实拍在线| 国产亚洲一区二区手机在线观看| 国产美女在线精品免费观看| 国产肥老妇视频| 亚洲精品18| 天堂8在线视频| 精品国产一区二区国模嫣然| 蜜桃视频一日韩欧美专区| 正义之心1992免费观看全集完整版| 欧美成人综合网站| 国产成人久久精品77777最新版本| 中文一区二区三区四区| 影音先锋欧美资源| 欧美黑人xxx| www精品久久| av第一福利大全导航| 欧美日韩亚洲不卡| 免费视频拗女稀缺一区二区| 欧美精品在线观看91| 九色丨蝌蚪丨成人| www在线观看免费| 无需播放器的av| 久久爱www| 91九色美女在线视频| 一二三区免费视频| 日韩在线观看a| 男女羞羞在线观看| 欧美午夜性视频| 九热爱视频精品视频| 日本在线观看免费| 手机成人在线| 91欧美激情另类亚洲| hs网站在线观看| 波多野结衣国产精品| 欧美一区二区三区在线| 中文字幕无码乱码人妻日韩精品| 亚洲一区在线视频观看| 精品日韩在线一区| 激情亚洲一区二区三区四区| 国产精品第12页| 国产精品一国产精品| 欧美日韩一区 二区 三区 久久精品| 国产又黄又粗又猛又爽的视频| 午夜视频久久久| 国产精品无av码在线观看| 精品动漫3d一区二区三区免费| 91精品观看| 国产在线观看无码免费视频| 制服下的诱惑暮生| 外国成人免费视频| 国产精品久久久久久久免费看| 日本黄色a视频| 欧美激情视频一区二区三区免费| 国产精品沙发午睡系列990531| 91久久久久国产一区二区| 久久99精品国产麻豆不卡| 日韩福利视频在线| 亚洲桃色在线一区| 国产日韩精品一区二区三区在线| 无码人妻精品一区二区三区99不卡| 免费成人黄色网址| 91精品办公室少妇高潮对白| 日韩欧美亚洲日产国产| 午夜福利理论片在线观看| 久久久久久久人妻无码中文字幕爆| 久精品在线观看| 国产网站欧美日韩免费精品在线观看| 青青青视频在线| 日韩视频免费在线| 国产精品不卡在线| 亚洲欧美激情小说另类| 日本一区二区三区在线视频| 999精品在线视频| 亚洲人成免费网站| 福利小视频在线观看| 美女扒开腿免费视频| 手机在线免费观看av| 黄瓜视频在线观看| 隔壁老王国产在线精品| 日本在线观看网站| 亚洲日本激情| 欧美日韩极品在线观看一区| 僵尸再翻生在线观看免费国语| 欧美一区二区影视| 日韩在线黄色| 日韩网站在线播放| jiujiure精品视频播放| 粗大的内捧猛烈进出视频| 人妻av无码专区| 国产精品免费成人| 激情图片在线观看高清国产| 婷婷丁香综合| 国产 日韩 欧美 在线| 99视频在线免费| 亚洲欧美中文字幕在线观看| 国产精品免费观看在线| 国产欧美婷婷中文| av黄在线观看| 亚洲国产精品久久久久爰色欲| 99久久久久久久| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 免费网站看电影大片| 在线观看视频欧美| 国产99视频精品免费视频36| 九九热最新视频//这里只有精品| 欧美videosex性欧美黑吊| 亚洲激情av| 精彩视频一区二区三区| 欧美大胆a级| 亚洲精品欧美综合四区| 伊人影院久久| 欧美三级一区| 中国老头性行为xxxx| 青娱乐国产在线| 色婷婷av一区二区三区gif| 久久99免费视频| 久久精品国产亚洲| 国产精品一码二码三码在线| 一区二区在线免费播放| 国产脚交av在线一区二区| 欧美在线你懂的| 欧美va日韩va| 成人写真福利网| 青娱乐国产盛宴| 日韩欧美第一页| 国产日韩在线观看视频| 国产精品青草久久久久福利99| 欧美日韩国产综合视频在线观看| 欧美著名女优| 色喇叭免费久久综合| 欧美一区二区二区| 精品人妻无码一区二区三区| 日韩电影中文字幕| 亚洲午夜激情网站| 欧美丝袜第三区| 成人国产亚洲精品a区天堂华泰| 五十路在线视频| 中文字幕免费视频观看| 在线观看免费视频一区二区三区| 国产一区欧美一区| 热re久久精品国产99热| 亚洲欧洲日本在线| 国产无遮挡又黄又爽免费软件| 榴莲视频成人app| 四虎在线免费视频| 欧美乱大交xxxx| 美女一区2区| 中文字幕人妻一区| 日韩久久久久久久久久久久久| 久久久久久久福利| 怡红院一区二区三区| 91视频国产资源| 要久久爱电视剧全集完整观看| 亚洲欧美日韩动漫| 亚洲国产精品影院| 亚洲成人天堂网| 亚洲二区在线观看| 欧美午夜在线一二页| 亚洲第一伊人| 992tv在线观看免费进| 隔壁老王国产在线精品| 日韩欧美猛交xxxxx无码| 亚洲精品国产无天堂网2021| 欧美色图天堂网| 人妻少妇精品无码专区| 国产传媒久久文化传媒| 欧美三级日韩在线| 欧美一级欧美三级在线观看| 亚洲自拍第二页| 性生交生活影碟片| 国产精品v亚洲精品v日韩精品| 欧产日产国产精品98| 午夜精品免费观看| 欧美视频国产视频| 日本综合精品一区| 日韩国产精品大片| 亚洲人妖av一区二区| 一本色道久久综合狠狠躁的推荐| 日本电影在线观看网站| 国产主播第一页| 五月激情丁香一区二区三区| 在线免费黄色毛片| 午夜激情视频在线| luxu259在线中文字幕| 中国一区二区三区| 久久99精品久久久久久水蜜桃| 国产一区福利视频| 手机在线免费观看毛片| www.com操| 日韩av官网| 在线观看一区二区三区三州| 涩涩漫画在线观看| 成人性生生活性生交12| 国产人妻精品一区二区三区| 日韩一级片在线播放| 国产亚洲va综合人人澡精品| 夜夜操免费视频| 久久91视频| 99re国产视频| 免费羞羞视频| 91香蕉视频在线观看视频| 成人av色在线观看| heyzo在线播放| 俄罗斯嫩小性bbwbbw| 一级毛片在线播放| 人人妻人人玩人人澡人人爽| 6080成人| 欧美区一区二区三区| 最新av在线网站| 久热中文字幕精品视频在线| 欧美日韩黄色大片| 男人的天堂久久精品| jizzjizz大全| 中文字幕一区二区三区最新| 秋霞影院一区二区| 国产欧美亚洲精品| 国产一区在线不卡| ririsao久久精品一区| 黄色的视频在线观看免费| 久久久久国产精品一区| 美国十次综合久久| 岛国精品在线播放| 亚洲国产中文在线二区三区免| www.超碰97| 噜噜噜久久亚洲精品国产品小说| 黄在线免费看| 天天做天天干天天操| 久久久久久久久久久人体| 精品一区二区视频| 麻豆精品久久久久久久99蜜桃| 天天综合精品| 国产在线观看免费麻豆| 日韩精品成人一区二区在线观看| 亚洲成熟少妇视频在线观看| 麻豆免费在线观看视频| 美女啪啪无遮挡免费久久网站| 成人久久一区二区| 免费不卡亚洲欧美| 岛国一区二区在线观看| 四虎8848精品成人免费网站| 久久国产精品毛片| 国产福利在线免费观看| 国内自拍视频在线播放| 国产精品一区二区婷婷| 成人午夜国产福到在线| 国产激情视频在线看| 国产在成人精品线拍偷自揄拍| 午夜精品一区二区三区视频免费看| 色wwwwww| 玖玖在线播放| www.中文字幕| 深夜福利在线观看直播| 国产亚洲精品久久久久久牛牛| 国产亚洲精品bt天堂精选| 国产最顶级的黄色片在线免费观看| 精品中文一区| 亚洲电影成人av99爱色| 久久久亚洲综合| 国产成人在线免费观看视频| 国产·精品毛片| 桃乃木香奈av在线| 亚洲77777| 精品国产区一区二| 欧洲免费av| 鲁大师成人一区二区三区| 一区二区三区观看| 久草视频在线免费看| 色欲av无码一区二区三区| 在线天堂资源www在线污| 白白色在线发布| 国产人妻一区二区| 精品久久久久一区| 成人免费xxxxx在线观看| 亚洲第一会所001| 国产日韩精品中文字无码|