亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? com應用軟件開發技術.txt

?? C++技巧集合 此集合包含很多關于C++變成的技巧,是一個非常不錯的資料集合
?? TXT
字號:
作者:hxfwsk
email: hxfwsk@hotmail.com
日期:6/25/2001 9:17:28 AM
主題詞: COM ActiveX C++ Builder 

1.COM技術概述 

COM表示Component Object Model(組件對象模型),它是Microsoft大力推廣的軟件開發技術。采用COM規范開發的應用軟件具有強大的功能,主要有如下幾點: 

◆COM是二進制編程規范,可以編寫被多種語言使用的代碼。 

◆用于創建ActiveX控件。 

◆通過OLE Automation 控制其它的程序。 

◆與其它機器上的對象或程序進行對話,構成分布式應用程序。 

Microsoft推出Windows 98和Windows NT 5.0后,整個操作系統的核心都圍繞著COM來建立。我們可以把Windows系統看作是一系列的COM接口,在需要是可以調用這些接口。如DirectX就是一系列的COM接口服務程序,通過它可以進行高性能的Windows圖形程序設計。 

用COM技術開發的應用程序從理論上說是客戶/服務器模式的程序。程序員可以使用一系列的COM服務程序來構造他們自己的應用程序,這些服務程序可以根據需要隨時嵌入到主程序中。在分布式系統中,可以通過網絡來訪問這些服務程序。將來,操作系統和整個網絡可能會被看作是一套以COM對象形式提供的服務集。一部分程序員負責建立這些服務,而另一部分程序員只負責如何調用它們。其目的是實現軟件的即插即用。 

開發COM應用程序是比較復雜的,通常需采用ActiveX模板庫(ATL)來編程。在這里我們推薦采用C++ Builder來開發COM程序,Inprise(Borland)公司的面向對象技術一直處于世界領先水平,C++ Builder采用可視化方法,隱藏了ATL的實現細節,自動生成COM接口所需的代碼。 

以下的程序舉例采用C++ Builder 4.0 編制,在中文Windows98環境下運行。 

2.建立COM服務程序 

COM服務程序有三種形式,第一種是駐留在本地機器上以DLL形式提供,該服務程序被調用時,嵌入到調用程序的線程中運行;第二種是駐留在本地機器上以EXE形式提供,該服務程序被調用時將占用獨立的線程運行;第三種駐留在遠端機器上以EXE形式提供,服務程序通過網絡被調用,它在遠端機器上運行,結果通過網絡返回調用者。 

在此采用第一種形式建立COM服務程序,這也是最常用的形式,DirectX就是采用這種形式提供的。 

C++ Builder建立COM服務程序的方法如下: 

2.1創建支持COM接口對象的動態連接庫文件: 

◆打開File/New/ActiveX項目頁,選擇ActiveX Library; 

◆選擇Save All 將項目以PCOMServer文件名保存;此時C++ Builder 自動生成如下的文件: 

PCOMServer.bpr:工程的項目文件; 

PCOMServer.h,PCOMServer.cpp:支持COM對象的動態連接庫源文件,其中有許多函數用于COM接口對象的自動裝配,大家不用去編輯它們; 

PCOMServer_ATL.h,PCOMServer_ATL.cpp:ATL形式的文件供C++ Builder編譯器調用,大家也不要去編輯它們。 

◆打開Project/Options/Linker 屬性頁不選中Use dynamic RTL選項,打開Project/Options/Packages屬性頁不選中Builder with runtime packages選項,這兩步操作可以使開發的COM動態連接庫不依賴C++ Builder的VCL動態連接庫,有利于獨立發行,但在一般情況下還是建議選中這兩項。 

2.2建立COM接口對象 




打開File/New/ActiveX屬性頁,選擇Automation Object表示向服務程序中插入一個自動類型的COM對象,我們選擇這種類型的COM對象是為了可以自動注冊,并且自動支持可以被其他語言調用。此時出現如下的對話框,輸入COM類的名字MyCOM即可,對話框中的其它選項用于規定COM對象的性質,可查看幫助信息。 

2.3通過類型庫編輯器編輯COM對象中相應接口對象的屬性和方法 




此時自動進入類型庫編輯器,類型庫用于存儲COM對象的說明,是一個可以被多種語言調用的頭文件包。在類型庫中,可以定義COM對象的接口,定義接口對象的屬性和方法等。類型庫編輯器如下所示: 

可以看出此時自動產生了MyCOM類的一個接口類IMyCOM,在COM應用軟件中我們實際上是與接口對象打交道,下面通過類型庫編輯器為IMyCOM接口定義方法和屬性。 

◆單擊編輯器頂部的Method按鈕; 

◆在Arributes頁面的Name字段中輸入方法的名稱,本例中是AddInt用于整數加法; 

◆在Parameters頁面中,單擊Add按鈕編輯方法中的參數; 

x和y是輸入的兩個整數,ret用于返回運算的結果,必須定義為指針型 

◆切換到Flags頁面,可以對接口的屬性作調整; 

◆在Text頁面中可以檢查生成的IDL代碼: 

[id(0x00000001)] 




HRESULT _stdcall AddInt([in] int x, [in] int y, [out, retval] int * ret ); 

◆單擊Refresh按鈕,此時可以關閉類型庫編輯器。當需要為接口添加新的屬性和方法時,可以通過View/Type Library重新打開編輯器。選擇Save All用C++ Builder提供的缺省文件名保存類型庫的相關文件如下: 

PCOMServer.TLB: 類型庫文件; 

PCOMServer_TLB.cpp:包含COM接口和對象的說明,其主要目的是方便訪問,在客戶程序中需將本文件包含到客戶程序的工程中; 

PCOMServer_TLB.h: PCOMServer_TLB.cpp的頭文件,通過#include引入到客戶程序中。 

MyCOMImpl.cpp: 該文件是我們需要編寫程序代碼的地方,實現類型庫定義的接口對象的方法和屬性; 

MyCOMImpl.h: MyCOMImpl.cpp的頭文件。 

2.4 實現COM接口中的方法 

打開MyCOMImpl.cpp文件會發現我們在類型庫編輯器中定義的方法,為該方法編寫代碼如下: 

STDMETHODIMP TMyCOMImpl::AddInt(int x, int y, int* ret) 

{ 

*ret=x+y; 

return S_OK; 

} 

2.5 生成DLL文件并注冊COM對象 

◆選擇Project/Builder PCOMServer 生成PCOMServer.DLL文件。 

◆打開類型庫編輯器,單擊Register按鈕完成對COM對象的注冊。 

通過Windows任務欄中的Run菜單運行REGEDIT程序,在Windows注冊表的HKEY_CLASSES_ROOT鍵下查找到PCOMServer.MyCOM子鍵,PCOMServer為DLL文件的名字,MyCOM為COM對象的名字,在下面可以看到該COM對象的全局唯一描述符CLSID如下: 

{59834F03-49F1-11D3-B85B-00E09804A418} 

注意:不同的機器生成的描述符不同. 

在HKEY_CLASSES_ROOT鍵下查找到CLSID子鍵,在它下面找{59834F03-49F1-11D3-B85B-00E09804A418}子鍵,下面有如下的條目: 

InprocServer32:存儲PCOMServer.DLL的路徑目錄; 

ProgID:存儲COM對象的注冊名:PCOMServer.MyCOM; 

Typelib:存儲COM對象的CLSID值{59834F03-49F1-11D3-B85B-00E09804A418}。 

COM對象就是通過在注冊表中的紀錄實現DLL與客戶程序的自動連接。 

3.建立COM客戶程序 

客戶程序將訪問PCOMServer.DLL服務程序中的MyCOM對象,這些對象的說明保存在前面所述的TLB文件中。我們可以直接將PCOMServer_TLB.cpp加入到客戶程序的項目文件中,并在客戶程序中引用PCOMServer_TLB.h文件;也可以通過Project/Import Type Library引用PCOMServer_TLB.TLB文件,重新生成.cpp和.h文件,自動完成上述過程。 

客戶程序的編程重點是實現對服務程序中COM對象的方法的調用,調用的方法有多種,都是通過所謂的代理接口來完成的,這些代理接口在PCOMServer_TLB.h中有詳細的定義,從這些定義中可以看出這些代理接口調用對象方法的過程。 

PCOMServer_TLB.h文件很重要,包含了調用MyCOM對象的各種接口信息,該文件主要內容如下: 

// Type Lib: D:\CAI\com\PCOMServer.tlb 

// IID\LCID: {5BD378E5-4B57-11D3-B85B-00E09804A418}\0 

// Helpfile: 

// DepndLst: 

// (1) v2.0 stdole, (C:\WINDOWS\SYSTEM\STDOLE2.TLB) 

// (2) v4.0 StdVCL, (C:\WINDOWS\SYSTEM\STDVCL40.DLL) 

// ************************************************************************ 

#ifndef __PCOMServer_TLB_h__ 

#define __PCOMServer_TLB_h__ 

#pragma option push -b -w-inl 

#include <vcl/utilcls.h> 

#if !defined(__UTILCLS_H_VERSION) || (__UTILCLS_H_VERSION < 0x0101) 

#error "This file requires an newer version of the header file UTILCLS.H" 

#endif 



#include <olectl.h> 

#include <ocidl.h> 

#if defined(USING_ATLVCL) || defined(USING_ATL) 

#if !defined(__TLB_NO_EVENT_WRAPPERS) 

#include <atl/atlmod.h> 

#endif 

#endif 



namespace Stdvcl {class IStrings; class IStringsDisp;} 

using namespace Stdvcl; 



namespace Pcomserver_tlb 

{ 

DEFINE_GUID(LIBID_PCOMServer, 0x5BD378E5, 0x4B57, 0x11D3, 0xB8, 0x5B, 0x00, 0xE0, 0x98, 0x04, 0xA4, 0x18); 

DEFINE_GUID(IID_IMyCOM, 0x5BD378E6, 0x4B57, 0x11D3, 0xB8, 0x5B, 0x00, 0xE0, 0x98, 0x04, 0xA4, 0x18); 

DEFINE_GUID(CLSID_MyCOM, 0x5BD378E8, 0x4B57, 0x11D3, 0xB8, 0x5B, 0x00, 0xE0, 0x98, 0x04, 0xA4, 0x18); 

interface DECLSPEC_UUID("{5BD378E6-4B57-11D3-B85B-00E09804A418}") IMyCOM; 

typedef IMyCOM MyCOM; 



#define LIBID_OF_MyCOM (&LIBID_PCOMServer) 

interface IMyCOM : public IDispatch 

{ 

public: 

virtual HRESULT STDMETHODCALLTYPE AddInt(int x/*[in]*/, int y/*[in]*/, int* ret/*[out,retval]*/) = 0; // [1] 

#if !defined(__TLB_NO_INTERFACE_WRAPPERS) 

int __fastcall AddInt(int x/*[in]*/, int y/*[in]*/) 

{ 

int ret; 

OLECHECK(this->AddInt(x, y, &ret)); 

return ret; 

} 

#endif // __TLB_NO_INTERFACE_WRAPPERS 

}; 

#if !defined(__TLB_NO_INTERFACE_WRAPPERS) 

template <class T /* IMyCOM */ > 



class TCOMIMyCOMT : public TComInterface<IMyCOM>, public TComInterfaceBase<IUnknown>

{ 

public: 

TCOMIMyCOMT() {} 

TCOMIMyCOMT(IMyCOM *intf, bool addRef = false) : TComInterface<IMyCOM>(intf, addRef) {} 

TCOMIMyCOMT(const TCOMIMyCOMT& src) : TComInterface<IMyCOM>(src) {} 

TCOMIMyCOMT& operator=(const TCOMIMyCOMT& src) { Bind(src, true); return *this;} 

HRESULT __fastcall AddInt(int x/*[in]*/, int y/*[in]*/, int* ret/*[out,retval]*/); 

int __fastcall AddInt(int x/*[in]*/, int y/*[in]*/); 

}; 

typedef TCOMIMyCOMT<IMyCOM> TCOMIMyCOM; 



template<class T> 

class IMyCOMDispT : public TAutoDriver<IMyCOM> 

{ 

public: 

IMyCOMDispT(){} 

IMyCOMDispT(IMyCOM *pintf) 

{ 

TAutoDriver<IMyCOM>::Bind(pintf); 

} 

IMyCOMDispT& operator=(IMyCOM *pintf) 

{ 

TAutoDriver<IMyCOM>::Bind(pintf); 

return *this; 

} 

HRESULT BindDefault(/*Binds to new instance of CoClass MyCOM*/) 

{ 

return OLECHECK(Bind(CLSID_MyCOM)); 

} 

HRESULT BindRunning(/*Binds to a running instance of CoClass MyCOM*/) 

{ 

return BindToActive(CLSID_MyCOM); 

} 

HRESULT __fastcall AddInt(int x/*[in]*/, int y/*[in]*/, int* ret/*[out,retval]*/); 

int __fastcall AddInt(int x/*[in]*/, int y/*[in]*/); 

}; 

typedef IMyCOMDispT<IMyCOM> IMyCOMDisp; 



template <class T> HRESULT __fastcall 

TCOMIMyCOMT<T>::AddInt(int x/*[in]*/, int y/*[in]*/, int* ret/*[out,retval]*/) 

{ 

return (*this)->AddInt(x, y, ret); 

} 



template <class T> int __fastcall 

TCOMIMyCOMT<T>::AddInt(int x/*[in]*/, int y/*[in]*/) 

{ 

int ret; 

OLECHECK(this->AddInt(x, y, &ret)); 

return ret; 

} 



template <class T> HRESULT __fastcall 

IMyCOMDispT<T>::AddInt(int x/*[in]*/, int y/*[in]*/, int* ret/*[out,retval]*/) 

{ 

static _TDispID _dispid(*this, OLETEXT("AddInt"), DISPID(1)); 

TAutoArgs<2> _args; 

_args[1] = x /*[VT_INT:0]*/; 

_args[2] = y /*[VT_INT:0]*/; 

return OutRetValSetterPtr(ret /*[VT_INT:1]*/, _args, OleFunction(_dispid, _args)); 

} 



template <class T> int __fastcall 

IMyCOMDispT<T>::AddInt(int x/*[in]*/, int y/*[in]*/) 

{ 

int ret; 

this->AddInt(x, y, &ret); 

return ret; 

} 



typedef TCoClassCreatorT<TCOMIMyCOM, IMyCOM, &CLSID_MyCOM, &IID_IMyCOM> CoMyCOM;

#endif // __TLB_NO_INTERFACE_WRAPPERS 

}; // namespace Pcomserver_tlb 

#if !defined(NO_IMPLICIT_NAMESPACE_USE) 

using namespace Pcomserver_tlb; 

#endif 

#pragma option pop 

#endif // __PCOMServer_TLB_h__ 

下面是文件中說明的主要對象及其定義: 

interface IMyCOM : public IDispatch 

class TCOMIMyCOMT : public TComInterface<IMyCOM> 

class IMyCOMDispT : public TAutoDriver<IMyCOM> 

class CoMyCOM: public CoClassCreator 

◆IMyCOM:通過IDispatch接口來調用對象的方法,該接口可以使對象被不支持虛擬函數表(VTable)的語言(如Visual Basic)說調用。這是一種很慢很苯的接口調用方式。 

◆TCOMIMyCOMT:通過所謂的智能接口來調用對象的方法,既可以實現IDispatch調用,也可以采用VTable進行調用,從而實現最快的調用速度。 

◆IMyCOMDispT:通過disp接口來調用對象的方法,可以提高Idispatch接口的訪問速度,但還是比不上VTable接口。 

◆CoMyCOM:通過使用CoClassCreator可以自動產生TCOMIMyCOM代理的實例。 

下面介紹一下實現智能接口和Disp接口調用的客戶程序。這個客戶程序很簡單,有兩個按鈕分別完成兩種接口調用的方法,一個編輯框顯示結果。 

◆智能接口的VTable調用方法如下: 

int x=6,y=6; 

TCOMIMyCOM O; 

O=CoMyCOM::Create(); //通過CoClassCreator完成初始化 

O->AddInt(x,y,&y); //Vtable形式調用 

Edit1->Text=IntToStr(y); 

◆DISP接口的調用方法如下: 

int x=6,y=6; 

IMyCOMDisp app; 

app.BindDefault(); //通過Bind完成初始化 

app.AddInt(x,y,&y); //Disp形式調用 

Edit1->Text=IntToStr(y); 

4.小結 

上面的程序舉例是很簡單的,但卻詳細說明了COM應用軟件的開發過程。COM技術不是一個編程語言,而是一種編程規范和方法。采用COM技術可以開發功能強大的軟件,有利于分布式應用技術的實現,有利于多人合作開發,也可以幫助我們理解Windows系統本身。COM的接口技術是比較復雜的,想進一步了解COM技術可參閱清華大學出版社的《COM技術內幕》一書。 

C++ Builder是開發COM應用軟件的好工具,它隱含了COM實現的細節,我們只需與它打交道就可以開發完善和強大的COM應用程序。希望有更多的人轉到COM應用軟件的開發上來,COM技術是軟件技術未來的發展方向,是實現軟件工程中軟件即插即用的有效途徑。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品亚洲午夜一区二区三区| 国产视频在线观看一区二区三区| 国产一区二区久久| 视频一区在线视频| 亚洲精品乱码久久久久| 国产视频一区二区在线| 欧美福利视频导航| 欧美天天综合网| 91黄色激情网站| 99在线精品一区二区三区| 国产一级精品在线| 国模大尺度一区二区三区| 日韩精品三区四区| 午夜电影一区二区三区| 亚洲成a人在线观看| 亚洲大尺度视频在线观看| 亚洲人成精品久久久久久| 中文字幕日本不卡| 国产精品乱人伦| 国产精品视频线看| 国产精品久久久久久亚洲伦| 欧美激情在线观看视频免费| 国产日韩av一区二区| 国产欧美一区二区精品性色| 国产女同互慰高潮91漫画| 欧美国产精品v| 椎名由奈av一区二区三区| 一区二区三区中文字幕电影 | 另类小说一区二区三区| 毛片一区二区三区| 韩国一区二区视频| 成人a免费在线看| 色综合一个色综合亚洲| 欧美色视频在线观看| 91精品国产综合久久国产大片| 日韩欧美亚洲国产另类| 国产欧美日韩另类视频免费观看| 国产精品国产自产拍高清av王其| 玉足女爽爽91| 美女视频第一区二区三区免费观看网站 | av影院午夜一区| 97精品电影院| 免费三级欧美电影| 国产高清亚洲一区| 一本高清dvd不卡在线观看| 欧美特级限制片免费在线观看| 欧美一区二区网站| 国产欧美一区二区三区在线老狼| 亚洲欧美精品午睡沙发| 麻豆国产精品视频| 成人免费看视频| 欧美片在线播放| 国产目拍亚洲精品99久久精品| 亚洲欧美欧美一区二区三区| 日本成人在线看| 97久久超碰国产精品电影| 欧美日韩高清在线| 亚洲国产高清在线观看视频| 三级一区在线视频先锋| www.欧美亚洲| 高清成人免费视频| 国产成人av一区二区三区在线| 国产一区二区电影| 国产+成+人+亚洲欧洲自线| 水蜜桃久久夜色精品一区的特点| 欧美成人精品福利| 国产在线播放一区二区三区| 精品一区二区综合| 一本色道久久综合亚洲aⅴ蜜桃| 欧美一区二区视频在线观看 | 国产精品乱码一区二区三区软件| 视频一区中文字幕国产| 91女神在线视频| 国产农村妇女毛片精品久久麻豆 | 99精品欧美一区二区蜜桃免费| 91精品婷婷国产综合久久竹菊| 中文字幕亚洲区| 国产黄色成人av| 欧美这里有精品| 欧美高清视频不卡网| 日韩欧美色综合网站| 亚洲成人免费视频| 在线一区二区三区| 亚洲欧美日韩中文字幕一区二区三区 | 亚洲成年人网站在线观看| 91视频精品在这里| 国产精品久久久久影视| 成人午夜电影网站| 日本一二三不卡| 岛国精品一区二区| 国产精品视频一区二区三区不卡| 国产激情视频一区二区在线观看 | 亚洲福中文字幕伊人影院| 色又黄又爽网站www久久| 国产精品女同一区二区三区| 国产乱理伦片在线观看夜一区| 久久色在线观看| 国产高清精品网站| 国产网站一区二区三区| 不卡在线观看av| 亚洲欧洲综合另类在线| 在线欧美日韩国产| 亚洲综合色在线| 69p69国产精品| 国内外成人在线| 欧美国产日韩亚洲一区| 不卡的电影网站| 一级精品视频在线观看宜春院| 欧美在线你懂得| 美女视频黄频大全不卡视频在线播放 | 精品成a人在线观看| 国产精品一二三四区| 国产亚洲欧美激情| 91老司机福利 在线| 亚洲h在线观看| 日韩精品在线看片z| 懂色av一区二区三区免费观看| 国产精品对白交换视频 | a美女胸又www黄视频久久| 中文字幕一区二区在线播放| 欧美日韩午夜影院| 激情成人综合网| 一区二区三区免费看视频| 精品日韩在线一区| 99精品热视频| 国产在线播放一区二区三区 | av色综合久久天堂av综合| 亚洲一区中文在线| 精品sm捆绑视频| 色婷婷综合在线| 激情久久五月天| 偷窥国产亚洲免费视频| 中文字幕欧美三区| 日韩一区二区三区视频| 成人av一区二区三区| 性做久久久久久久久| 国产精品视频一二| 欧美va亚洲va| 欧美剧在线免费观看网站| 成人av在线影院| 极品瑜伽女神91| 亚洲123区在线观看| 国产精品国产精品国产专区不蜜 | 国产欧美综合在线观看第十页| 日本道免费精品一区二区三区| 精品一区二区三区欧美| 亚洲成人久久影院| 一区二区三区日韩| 国产精品美女www爽爽爽| 精品三级在线看| 7777精品伊人久久久大香线蕉最新版| 91小宝寻花一区二区三区| 国产精品一区二区三区网站| 人人狠狠综合久久亚洲| 亚洲综合在线第一页| 亚洲欧洲成人av每日更新| 久久久久一区二区三区四区| 91精品免费在线| 欧美日韩一区中文字幕| 色偷偷成人一区二区三区91| youjizz国产精品| 国产成人精品午夜视频免费| 国内精品视频666| 久久99九九99精品| 免费在线观看视频一区| 婷婷亚洲久悠悠色悠在线播放| 亚洲一区二区免费视频| 亚洲精品乱码久久久久久黑人 | 久久久久久电影| 久久综合九色欧美综合狠狠| 日韩精品一区二区三区在线观看| 69av一区二区三区| 91麻豆精品久久久久蜜臀| 91麻豆精品国产91久久久资源速度| 欧美午夜一区二区| 欧美在线视频不卡| 欧美精品第一页| 日韩欧美一区二区不卡| 久久久午夜精品理论片中文字幕| 精品国产sm最大网站| 久久久久久免费毛片精品| 久久久夜色精品亚洲| 国产欧美一区在线| 中文字幕中文乱码欧美一区二区| 成人免费在线观看入口| 亚洲精品乱码久久久久久黑人| 亚洲一区二区三区视频在线播放| 天堂在线亚洲视频| 美腿丝袜亚洲综合| 国产精品一区二区三区网站| 97久久人人超碰| 7777女厕盗摄久久久| 久久亚洲精品国产精品紫薇| 国产精品看片你懂得| 亚洲在线观看免费| 精品国产凹凸成av人网站| 韩国成人福利片在线播放| 国产成人综合在线| 91香蕉视频mp4| 欧美日韩一区二区在线观看视频|