freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

com接口與對(duì)象(已修改)

2025-10-10 21:52 本頁(yè)面
 

【正文】 COM接口與對(duì)象 潘愛民 內(nèi)容 ?組件的接口 ?COM接口 ?COM IDL ?COM對(duì)象 從歷史看 COM ?COM產(chǎn)生的背景 – 93年因?yàn)?OLE 2的需要而產(chǎn)生 – OLE 1的缺陷 ?COM又從 OLE中脫穎而出 – COM的優(yōu)勢(shì)不限于 OLE – COM成為 Microsoft跟上 Inter的一項(xiàng)重要基礎(chǔ)技術(shù) ?今天的 Windows平臺(tái)上, COM無處不在 COM基礎(chǔ) —— 三個(gè)概念 ?COM組件 –可獨(dú)立發(fā)布的二進(jìn)制組件 –在 Windows平臺(tái)上為 DLL或者 EXE ?COM對(duì)象 –通過 COM接口提供服務(wù) –符合 OO中對(duì)象的基本概念 ?COM接口 –客戶與對(duì)象之間的協(xié)議,對(duì)象實(shí)現(xiàn) COM接口,客戶使用 COM接口 如何設(shè)計(jì)? ?COM組件 –為方便起見,只討論 Windows平臺(tái)上DLL類型的組件 ?COM對(duì)象 –如何標(biāo)識(shí)一個(gè)對(duì)象?對(duì)象以什么形式存在?客戶如何創(chuàng)建對(duì)象? –對(duì)象如何暴露接口?一個(gè)或是多個(gè)? ?COM接口 –要求:跨編譯器、跨語言、跨平臺(tái) 設(shè)計(jì) COM接口 —— 從 C++入手 ?C++類:接口與實(shí)現(xiàn)的分離 –接口:類的 public部分 class CMyString { private: char *m_psz。 public: CMyString(const char * psz)。 ~CMyString()。 const char*Find(const char *psz)。 int Length()。 }。 設(shè)計(jì) COM接口 —— 從 C++入手 (續(xù) ) ?C++類的實(shí)現(xiàn) CMyString::CMyString(const char * psz) : m_psz( new char[psz ? strlen(psz)+1 :1]) { if ( psz ) strcpy(m_psz,psz)。 else m_psz[0] = 0。 } CMyString::~CMyString() { delete [] m_psz。 } const char*CMyString::Find(const char *psz) { return strstr(m_psz,psz)。 } int CMyString::Length() { return strlen(m_psz)。 } C++類的鏈接 linking ?靜態(tài)鏈接 –許多類庫(kù)的做法 –編譯時(shí)刻的鏈接 ?靜態(tài)鏈接的缺點(diǎn) –代碼重復(fù):多個(gè)程序各有自己的代碼,需要更多的內(nèi)存 –客戶程序占據(jù)更多的外存空間 –庫(kù)代碼更新需要重新編譯所有的客戶程序 C++類的鏈接 linking(續(xù) ) ?動(dòng)態(tài)鏈接 –運(yùn)行時(shí)刻的鏈接 ?動(dòng)態(tài)鏈接形式 –編譯時(shí)刻通過引入庫(kù) –運(yùn)行時(shí)刻完全動(dòng)態(tài) ?Dll Hell ifdef MYSTRINGDLL define EXPORTORIMPORT _declspec(dllexport) else define EXPORTORIMPORT _declspec(dllimport) endif class EXPORTORIMPORT CMyString { private: char *m_psz。 public: CMyString(const char * psz)。 ~CMyString()。 const char*Find(const char *psz)。 int Length()。 }。 C++接口如何走向 COM接口 ?動(dòng)態(tài)鏈接符合 COM的需要 ?C++中類形式的接口存在的問題 –客戶看到了什么? –若用 Visual C++ ??0CMyString@@QAE@PBD@Z ??1CMyString@@QAE@XZ ?Find@CMyString@@QAEPBDPBD@Z ?Length@CMyString@@QAEHXZ 客戶眼中的 C++類 (續(xù) ) ?如果是 Borland C++編譯器 () @CMyString@$bctr$qpxc @CMyString@$bdtr$qv @CMyString@Find$qpxc @CMyString@Length$qv ?問題 1:名字沖突 命名沖突解決方案 1 ?模塊定義文件 (.def)中給出別名 LIBRARY MYSTRING EXPORTS @CMyString@$bctr$qpxc=??0CMyString@@QAE@PBD@Z @CMyString@$bdtr$qv=??1CMyString@@QAE@XZ @CMyString@Find$qpxc=?Find@CMyString@@QAEPBDPBD@Z @CMyString@Length$qv=?Length@CMyString@@QAEHXZ 命名沖突解決方案 2 ?模塊定義文件 (.def)中給出序號(hào)別名 LIBRARY MYSTRING EXPORTS ??0CMyString@@QAE@PBD@Z @1 ??1CMyString@@QAE@XZ @2 ?Find@CMyString@@QAEPBDPBD@Z @3 ?Length@CMyString@@QAEHXZ @4 LIBRARY MYSTRING EXPORTS @CMyString@$bctr$qpxc @1 @CMyString@$bdtr$qv @2 @CMyString@Find$qpxc @3 @CMyString@Length$qv @4 命名沖突解決方案 3 ?使用 C++類的 vtable ?C++類的 vtable不隨編譯器而變化 ?vtable包含了各個(gè)函數(shù)的原型,順序固定,每個(gè)函數(shù)的參數(shù)、返回類型等,函數(shù)名并不重要 ?vtable要求這些接口函數(shù)必須是虛函數(shù) ?客戶如何得到 vtable? –仍然需要有一種辦法來創(chuàng)建 C++類 – new/delete? 需要對(duì)象的二進(jìn)制結(jié)構(gòu) ——問題 2 C++對(duì)象的二進(jìn)制結(jié)構(gòu) ?C++的封裝是語法上的封裝,而不是二進(jìn)制封裝 ?new/delete是編譯器相關(guān)的 –編譯器不僅要知道 public信息,也要知道private信息 ?C++對(duì)象的二進(jìn)制結(jié)構(gòu)是編譯器相關(guān)的 ?即使客戶看到的 C++類公開接口沒有變化,但是 C++類的實(shí)現(xiàn)改變了,仍然會(huì)打破客戶與對(duì)象之間的連接 C++對(duì)象與客戶之間的連接問題 ?客戶與 C++對(duì)象之間的連接點(diǎn)越小越好 –只有接口部分必要的信息才放入接口 –把 C++類的實(shí)現(xiàn)細(xì)節(jié)與接口分開 –提取出針對(duì)所有編譯器都不變的因素作為客戶與對(duì)象共享的接口信息 ?方案 1:句柄 句柄方案 ?方案 1:句柄 ifndef CMyString class CMyString。 endif class EXPORTORIMPORT IMyString { private: CMyString *m_pthis。 public: IMyString(const char * psz)。 ~IMyString()。 const char*Find(const char *psz)。 int Length()。 }。 class CMyString { private: char *m_psz。 int m_nLength。 public: CMyString(const char * psz)。 ~CMyString()。 const char*Find(const char *psz)。 int Length()。 }。 純虛基類方案 ?前提條件: –在給定平臺(tái)上所有的編譯器都會(huì)產(chǎn)生同樣的二進(jìn)制結(jié)構(gòu) –純虛函數(shù)在單繼承情況下滿足這一條件 ?純虛基類只包含虛函數(shù),限定每個(gè)虛函數(shù)的調(diào)用習(xí)慣 ?對(duì)于跨平臺(tái)的情形,我們肯定要通過中間層,所以暫時(shí)可以不考慮 虛函數(shù)的繼承布局情況 class B : pulic A { private : int value1。 public: virtual void Func1(void) virtual void Func2(void) }。 變量 偏移量 vptr 0 value1 4 B::Func1 B::Func2 vtable 純虛基類方案例子 ?解決了名字沖突 ?解決了 C++類的二進(jìn)制布局不兼容問題 – 客戶只看到 vtable, 沒有看到其他的實(shí)現(xiàn)細(xì)節(jié) – 保證不同語言編寫的程序可以互操作
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
公安備案圖鄂ICP備17016276號(hào)-1