COM/ATL通信原理

2020-12-05 聊聊密碼學

COM的通信原理

1.通信模型:一般,我們只使用客戶端程序到組件的通信,並且這種通信是通過組件的接口來實現的。現在,我們講一下伺服器到客戶端之間如何打開一個雙向通信通道,並提供一個功能更加強大的通信環境。按下面的方法可以提供一個具備回調功能(或稱通知)的組件:

1)在一個組件中描述幾個接口,其中一部分接口由組件實現(如IMath),一部分接口則由客戶端程序實現(如ICallback)。

2)在客戶端程序中,使用自己喜歡的技術實現一個接口,並由組件來描述(如iCallback)。

3)組件在其中的一個入站接口上實現一個方法(如IMath::Advise),客戶端程序可以通過該方法傳送它的一個接口指針(ICallback)。

4)然後組件通過客戶端實現的接口調用接口方法,為客戶端程序提供通知消息。

2.引入和引出接口

COM使用incoming interface(引入接口)和outing interface(引出接口)兩個術語,來描述組件可以支持的兩種不同類型的接口。一個引入接口是指由組件實現的接口,如IMath是個引入接口,因為它是由你的組件來實現的。一個引出接口是指在組件的類型庫中描述的接口,但是它實際上是由math組件的客戶端程序實現的。

3.示例

interface ICallback:IDispatch

[

[id(1),helpstring("顯示求和結果")] HRESULT Show([in] long sum);

]

interface IMath:IDispatch

[

[id(1),helpstring("求和並顯示")] HRESULT Add([in] long num1,[in] long num2,[out,retval] long* ret);

[id(2),helpstring("添加引出接口") HRESULT Advise([in] ICallback* pCallback);

[id(3),helpstring("釋放接口") HRESULT Unadvise();

]

class CMath:IMath

{

CComPtr<ICallback> m_pCallback;

STDMETHODIMP Add(long num1,long num2)

{

long ret=num1+num2;

if(m_pCallback)

m_pCallback->Show(ret);

return S_OK;

}

STDMETHODIMP Advise(ICallback* pCallback)

{

m_pCallback=pCallback;

pCallback->AddRef();

return S_OK;

}

STDMETHODIMP Unadvise()

{

m_pCallback->Release();

m_pCallback=0;

return S_OK;

}

}

客戶端程序首先實現ICallback接口中的函數,並把ICallback的實現類通過Advise傳給CMath,這樣當進行加法時,就能通知客戶端了,這就是COM的通信原理。

ATL通信方法

ATL提供了IDispEventSimpleImpl和IDispEventImpl兩個模板類,這兩個模板類可用於在 ATL 類中提供連接點接收器支持,為事件調度接口提供了實現,我們只需要對要接收的事件方法提供實現。這些連接點接收器是用事件接收映射(由類提供)來映射的。

1.若要正確地實現類的連接點接收器,必須完成以下步驟:

1)為每個外部對象導入類型庫 (如:#import "progid:SendEvent.MyMath" raw_interfaces_only, no_namespace, named_guids),

2)繼承 IDispEventImpl接口(如public:IDispEventSimpleImpl<1,CSumDlg,&DIID_IMathEvents>),

或 繼承IDispEventSimpleImpl 接口(如IDispEventImpl<1,CSumDlg,&DIID_IMathEvents,&LIBID_SendEvent,1,0>) 。

3)聲明事件接收映射 ,在類中添加BEGIN_SINK_MAP(classname)、END_SINK_MAP()宏,

4)IDispEventSimpleImpl都必須添加一個宏SINK_ENTRY_INFO去實現事件接收映射。如:

BEGIN_SINK_MAP(CSumDlg)

SINK_ENTRY_INFO(1,DIID_IMathEvents,1,OnShow,&ShowInfo)

END_SINK_MAP()

5)IDispEventImpl都必須添加一個宏SINK_ENTRY或SINK_ENTRY_EX去實現事件接收映射。如

BEGIN_SINK_MAP(CSumDlg)

SINK_ENTRY_EX(1,DIID_IMathEvents,1,OnShow)

END_SINK_MAP()

6)實現事件處理函數,如實現OnShow函數。

7)通知(調用DispEventAdvise與數據源建立連接)。

8)和取消通知連接點 (調用DispEventUnadvise斷開連接)。

2.詳細解析

1)IDispEventImpl繼承於IDispEventSimpleImpl,他們的大部分功能是相同的,區別僅在於IDispEventImp是從類型庫中獲取接口信息,而IDispEventSimpleImp是通過一個指向SINK_ENTRY_INFO結構體的指針獲得事件信息。

2)IDispEventImpl和IDispEventSimpleImpl的參數分別為

IDispEventImpl<

>

IDispEventSimpleImpl<

>

其中,

T:從IDispEventImpl/ IDispEventSimpleImpl派生的類;

3)宏的操作

事件接收映射必須以BEGIN_SINK_MAP(class)開頭,以END_SINK_MAP()結尾,其中class是接收事件的類。

SINK_ENTRY_INFO、SINK_ENTRY_INFO和SINK_ENTRY的關係為

SINK_ENTRY_INFO(id, iid, dispid, fn, info)

#define SINK_ENTRY_EX(id, iid, dispid, fn) SINK_ENTRY_INFO(id, iid, dispid, fn, NULL)

#define SINK_ENTRY(id, dispid, fn) SINK_ENTRY_EX(id, IID_NULL, dispid, fn)

其中,

id:唯一標識數據源對象的標誌,與模板類的第一個參數對應;

iid::要接收的事件調度接口的DIID指針;

dispid:事件的調度ID,與接口中方法的ID對應;

fn:事件處理函數;

info:SINK_ENTRY_INFO結構體的指針,主要包括事件的參數和返回值信息。

相關焦點

  • 光纖通信原理
    導讀:想必大家對光纖通信都不陌生了吧,光纖通信憑藉其傳輸容量大,保密性好,已經成為世界上最主要的有線通信方式。它到底為何如此厲害呢?下面我為大家簡單介紹一下光纖通信的原理吧!!!
  • 「量子通信」不懂通信原理
    「量子通信」不懂通信原理:首先我們來分析通信原理,我們的手機無線通信,是手機發射能量信號,這個信號能量扇動空氣,空氣振動傳播至遠方,被遠方接收器感應到此能量的空氣振動信號,從而產生通信。信號是能量,能量強弱及強弱變化頻率可以代表無數的信號。什麼信號,在於人設定它的強弱與頻率,並告知對方,從而產生通信,知曉信號意思。
  • 詳解無線通信原理和LoRa擴頻通信技術
    當人類進入了無線通信時代,我們的生活發生了巨大的改變。無線通信具有一些天生優勢,我們常說一個模擬信號代表的就是一個連續變化電磁波,一個數位訊號就是代表一個電壓脈衝序列,計算機局域共享則是典型的數字數據通過數位訊號傳輸。通信信號最大的問題就是噪聲,因為噪聲會影響數字位,今天我們來了解一下它的具體原理。 1901年,古列爾默。
  • 量子通信(原理及最新進展)
    (詳細介紹見量子研究網站:http://quantum-study.com/article/859/20.html)圖:經典通道與量子通道迄今為止,而基於"量子不可分割"和"量子不可克隆定理"的量子力學基本原理,量子密碼技術為我們提供了一種全新的密碼解決方案。
  • 量子通信原理
    由於2016年8月16號墨子號衛星的升空,很多人對量子通信非常感興趣。量子通信是建立在量子糾纏基礎上的,而量子糾纏不是容易理解的物理現象對其真實性一直就存在懷疑的聲音。因此對量子通信衛星也出現了懷疑和反對的聲音,有人認為是量子通信本身就是一個忽悠。本文試圖從物理學的基本原理出發介紹量子通信物理原理以及墨子號衛星可能要進行的物理實驗。
  • 微波通信原理的詳細介紹
    本文引用地址:http://www.eepw.com.cn/article/201602/286825.htm  由於微波的頻率極高,波長又很短,共在空中的傳播特性與光波相近,也就是直線前進,遇到阻擋就被反射或被阻斷,因此微波通信的主要方式是視距通信,超過視距以後需要中繼轉發。
  • 什麼是量子安全通信原理?
    量子安全直接通信是對通信理論的發展,將基於Shannon(香農)資訊理論的噪聲信道下可靠通信發展為基於Wyner(懷納)搭線信道理論的噪聲和竊聽信道下安全和可靠通信。通過介紹量子安全直接通信的原理及特點、基於單光子和糾纏光子對的兩種典型量子安全直接通信協議,綜述了近年來量子安全直接通信的重要進展,展望了其發展前景。
  • 無線通信原理
    本文引用地址:http://www.eepw.com.cn/article/271849.htm  在無線通信中頻譜包括了9khz到300000Ghz之間的頻率。每一種無線服務都與某一個無線頻譜區域相關聯。無線信號也是源於沿著導體傳輸的電流。電子信號從發射器到達天線,然後天線將信號作為一系列電磁波發射到空氣中。
  • 關於通信原理的一點總結
    簡介:學了通信原理這門課,一開始覺得很難,而且聽學長們也總是告誡我們,通信原理是很難的課程,平時一定要好好學,不然自己複習的日子根本就抓不到要點了。事實上好像也是如此,在周圍,這門主課的掛課率總是算前排的。
  • 紅外線通信原理及特點
    打開APP 紅外線通信原理及特點 發表於 2017-11-02 17:46:18   紅外線通信是一種利用紅外線傳輸信息的通信方式。
  • 紅外遙控器通信原理_紅外遙控器協議_紅外通信對比無線通信的優勢
    紅外遙控器通信原理_紅外遙控器協議_紅外通信對比無線通信的優勢 佚名 發表於 2017-08-03 17:50:56   紅外通訊,顧名思義,就是通過紅外線傳輸數據
  • 標準正交基應用於通信原理課程的教學研究
    摘要:通信原理是一門具有很強物理意義的專業理論課,因其內容抽象而繁雜,給教學帶來了一定的困難。基於整合教學內容的目的,本文探討了將眾多調製方式(包括模擬調製和數字調製)統一為正交調製模型的教學方案。
  • 光纖通信的原理與發展狀況
    光纖通信就是利用光波作為載波來傳送信息,而以光纖作為傳輸介質實現信息傳輸,達到通信目的的一種最新通信技術。  通信的發展過程是以不斷提高載波頻率來擴大通信容量的過程,光頻作為載頻已達通信載波的上限,因為光是一種頻率極高的電磁波,因此用光作為載波進行通信容量極大,是過去通信方式的千百倍,具有極大的吸引力,光通信是人們早就追求的目標,也是通信發展的必然方向。
  • 短波通信原理和傳播方式
    打開APP 短波通信原理和傳播方式 秩名 發表於 2011-11-01 16:31:56   短波通信(Short-wave Comunication)是無線電通信的一種。
  • 量子通信,到底是什麼工作原理?
    而量子信息又分為了量子計算和量子通信。大家經常聽說的量子計算機,就屬於量子計算,和我們今天介紹的量子通信有很大的區別。量子通信,分為「量子密鑰分發」和「量子隱形傳態」。它們的性質和原理是完全不同的。簡單來說,「量子密鑰分發」只是利用量子的不可克隆性,對信息進行加密,屬於解決密鑰問題。
  • 基於正交小波函數族的多址通信原理及其應用
    本文描述了基於正交小波函數族的多址通信原理,並提出了一種多速率正交小波調製方法.用具有不同伸縮尺度的小波函數對不同信道中的碼流進行編碼,可以達到擴展信息序列頻譜的目的  關鍵詞:小波;多址通信;調製;擴展頻譜本文引用地址:http://www.eepw.com.cn/article/153954.htmThe Applications of Wavelet in Spread Spectrum Communications
  • 【E課堂】紅外通信協議及原理精講
    紅外通信基本原理本文引用地址:http://www.eepw.com.cn/article/201701/343102.htm  紅外通信是利用近紅外波段的紅外線作為傳遞信息的媒體,即通信信道。發送端將基帶二進位信號調製為一系列的脈衝串信號,通過紅外發射管發射紅外信號。
  • 西安郵電大學2016考研822通信原理考試大綱
    下面是西安郵電大學2016考研822通信原理考試大綱,供大家查閱。   西安郵電大學2016考研822通信原理考試大綱   科目代碼:822   科目名稱:《通信原理》   一、課程性質和任務   本課程是通信類專業的一門核心專業基礎課
  • 舉起奧卡姆剃刀解剖量子通信的贅疣
    「如無必要,勿增實體」奧卡姆剃刀原理(Occam's Razor)是由14世紀英格蘭的邏輯學家、聖方濟各會修士奧卡姆的威廉(William of Occam,約1285年至1349年)提出。該原理可歸結為「如無必要,勿增實體」,即「簡單有效原理」。他在《箴言書注》2卷15題說「切勿浪費較多東西去做那些用較少的東西同樣可以做好的事情。」
  • 5G時代來了,還不了解通信原理嗎?
    嗨嘍,大家好,5G時代來了,還不了解通信原理嗎?今天開始,會不定期給大家梳理通信原理,電子通信類的童鞋們就當複習了,熱愛通信的盆友們也可看看,豐富自己的知識,好了,話不多說,從頭開始吧。通信系統至少包含哪幾部分?答:信息:消息中包含的有意義的內容;信號:消息的攜帶者;通信:利用電或光信號將消息中所包含的信息從信源發送到一個或多個目的地;通信系統至少包含發送設備、信道、接受設備。