Developing COM Components using VC-ATL(3-3) (轉)

amyz發表於2007-08-17
Developing COM Components using VC-ATL(3-3) (轉)[@more@]

:namespace prefix = o ns = "urn:schemas--com::office" />

n  編寫Visual C++

確定建立元件的最有效的工具

當你著手建立COM元件時,你可以選擇與、、MFC和ATL不同的工具。讓我們比較一下每個工具,來揭露它們各自的優點和缺點。

當著手寫COM類時,你可以有幾種選擇,你可以選擇用C++滿足COM。這種選擇提供了最大的靈活性但是很枯燥。另外,你可以選擇Visual C++提供的兩種主要的來寫COM:MFC和ATL。

MFC使用文件檢視體系結構設計良好的開發基於的應用。使用MFC設計基於Windows應用程式要求執行時間庫MFC42.DLL來。當用於開發確定型別的應用程式時,MFC遇到要求大的執行時間庫開銷。MFC有利於像基於Windows的單層應用程式、請求許多GUI客戶端的應用程式、和OLE文件的開發。對COM的支援是後來增加的並且依靠它的文件檢視體系結構。雖然Visual C++嚮導使得用MFC建立元件容易很多,但於框架結構先天設計缺陷,所以它並不是一種靈活的方法。而且,元件以體積大和要求擴充套件DLL而告終。

相反,ATL是針對COM來設計的。此外,ATL提供像聚合和包容不同的類合成技術的完全支援。ATL使用C++模板類的多繼承技術來實現COM類。ATL允許COM元件、自動化伺服器和ActiveX控制元件的建立。使用ATL建立的COM更小更快。ATL提供許多COM介面的本地支援和由伺服器支援的新執行緒模型。由於ATL主要使用模板的概念,建立的元件大小很小,並且執行期DLL很小並可動態載入。

所以,你應用ATL建立COM。

元件功能:同上(編寫Visual Basic元件)。

元件將包含以下:ValidateCreditCard、PrefixCheck、LengthCheck、LuhnCheck。僅ValidateCreditCard可以被應用程式來封裝元件的工作方式。

為了建立驗證信用卡的伺服器元件,你需要執行以下步驟:

1.  建立應用程式框架
啟動VC++6.0,從File選單選項選中 New 選單項,在出現的 New 對話方塊中選中 Projects 卡片,從顯示的工程型別中選中 ATL COM  AppWizard。指定工程工作空間名,即在 Project Name 編輯框中輸入專案名ValidateCreditCardServer,以區別於Visual Basic元件工程ValidateCardServer。選擇合適的 Location 後,按確認按鈕進入下一個對話方塊:ATL  COM  Appwizard  -  step 1 of  1,在 Server Type 中選擇 Dynamic  Link  Library [ DLL ],即程式內伺服器元件。選中 Support  MFC 選項。在按下 Finish 和 Ok 按鈕後,一個元件的框架已經建立。現在讓我們來看一下生成的的清單

n  stdafx.h

n  stdafx.cpp

n  ValidateCreditCardServer.idl

n  ValidateCreditCardServer.rc

n  Re.h

n  ValidateCreditCardServer.def

n  ValidateCreditCardServerps.def

n  ValidateCreditCardServer.h

n  ValidateCreditCardServer.cpp

n  ValidateCreditCardServer.dsp

n  ValidateCreditCardServer.dsw

n  ValidateCreditCardServer.ncb

n  ValidateCreditCardServerps.mk

n  ValidateCreditCardServer.clw

ValidateCreditCardServer.cpp清單


// ValidateCreditCardServer.cpp : Implementation of DLL Exports.

// Note: /Stub Information

//  To build a separate proxy/stub DLL,

//  run nmake -f ValidateCreditCardServerps.mk in the project directory.

#include "stdafx.h"

#include "resource.h"

#include

#include "ValidateCreditCardServer.h"

#include "ValidateCreditCardServer_i.c"

#include "ValidateCard.h"

CComModule _Module;

BEGIN__MAP(ObjectMap)

OBJECT_ENTRY(CLSID_ValidateCard, CValidateCard)

END_OBJECT_MAP()

class CValidateCreditCardServerApp : public CWinApp

{

public:

// Overrs

  // ClassWizard generated virtual function overrides

  //{{AFX_VIRTUAL(CValidateCreditCardServerApp)

  public:

  virtual BOOL InitInstance();

  virtual int ExitInstance();

  //}}AFX_VIRTUAL

  //{{AFX_MSG(CValidateCreditCardServerApp)

  // NOTE - the ClassWizard will add and remove member functions here.

  //  DO NOT EDIT what you see in these blocks of generated code !

  //}}AFX_MSG

  DECLARE_MESSAGE_MAP()

};

BEGIN_MESSAGE_MAP(CValidateCreditCardServerApp, CWinApp)

  //{{AFX_MSG_MAP(CValidateCreditCardServerApp)

  // NOTE - the ClassWizard will add and remove map macrhere.

  //  DO NOT EDIT what you see in these blocks of generated code!

  //}}AFX_MSG_MAP

END_MESSAGE_MAP()

CValidateCreditCardServerApp theApp;

BOOL CValidateCreditCardServerApp::InitInstance()

{

  _Module.Init(ObjectMap, m_hInstance, &LIBID_VALIDATECREDITCARDSERVERLib);

  return CWinApp::InitInstance();

}

int CValidateCreditCardServerApp::ExitInstance()

{

  _Module.Term();

  return CWinApp::ExitInstance();

}

/////////////////////////////////////////////////////////////////////////////

// Used to detene whether the DLL can be unloaded by OLE

STD DllCanUnloadNow(void)

{

  AFX_MANAGE_STATE(AfxGetStaticModuleState());

  return (AfxDllCanUnloadNow()==S_OK && _Module.GetLockCount()==0) ? S_OK : S_FALSE;

}

/////////////////////////////////////////////////////////////////////////////

// Returns a class factory to create an object of the requested type

STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)

{

  return _Module.GetClassObject(rclsid, riid, ppv);

}

/////////////////////////////////////////////////////////////////////////////

// DllRegisterServer - Adds entries to the system registry

STDAPI DllRegisterServer(void)

{

  // registers object, typelib and all interfaces in typelib

  return _Module.RegisterServer(TRUE);

}

/////////////////////////////////////////////////////////////////////////////

// DllUnregisterServer - Removes entries from the system registry

STDAPI DllUnregisterServer(void)

{

  return _Module.UnregisterServer(TRUE);

}


2.  建立框架中的元件
從Insert選單中選中 New ATL  Object…選單項,出現 ATL Object  Wizard 對話方塊。

在ATL Object  Wizard中,在左邊的 Category 中選擇 Objects,右邊的 Objects 中選中 Simple  Object 項。按 Next 按鈕。

在出現的 ATL Object  Wizard 屬性對話方塊中 Names 卡片中的八個編輯框中左上方的 Short Name 編輯框中輸入短名ValidateCard ,其他七個編輯框的內容會自動生成。在這裡我們也對這一對話方塊的其他七個編輯框的內容作一個詳細地剖析:

C++塊

Short Name:ValidateCard//輸入

Class:CValidateCard//產生元件類的實現類的類名

.H File:ValidateCard.h//產生元件類的實現類的標頭檔案

.CPP File:ValidateCard.cpp//產生元件類的實現類的實現檔案

COM塊

CoClass:ValidateCard//產生的元件類,區別於元件類的實現類

Interface:IValidateCard//建立元件類時,同時建立一個此元件類的一個使用者介面

Type:ValidateCard Class//元件類的型別

ProgID:ValidateCreditCardServer.ValidateCard// CLSIDFromProgID呼叫,用它得到CLSID

然後按確認按鈕退出。這將生成如上的資訊並且在需要的檔案中同樣地作一個登陸,特別是IDL檔案。在這裡我們比較一下建立元件前後的兩個版本的IDL檔案。

建立元件前的ValidateCreditCardServer.idl檔案,即建立應用程式框架後的IDL檔案。


 

// ValidateCreditCardServer.idl : IDL source for ValidateCreditCardServer.dll

//

// This file will be processed by the MIDL tool to

// produce the type library (ValidateCreditCardServer.tlb) and marshalling code.

import "oaidl.idl";

import "ocidl.idl";

[

  uuid(B3404054-C33E-4931-B737-5783CEEFEC),

  version(1.0),

  helpstring("ValidateCreditCardServer 1.0 Type Library")

]

library VALIDATECREDITCARDSERVERLib

{

  importlib("stdole32.tlb");

  importlib("stdole2.tlb");

};


(篇幅所限,未完,待續)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-963660/,如需轉載,請註明出處,否則將追究法律責任。

相關文章