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

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

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

建立後的IDL

 

ValidateCreditCardServer.idl清單


import "oaidl.idl";

import "ocidl.idl";

  [

  ,

  uuid(B1D1C73C-E340-4FDC-8734-92ECEC64DC4E),

  dual,

  helpstring("IValidateCard Interface"),

  pointer_default(unique)

  ]

  interface IValidateCard : IDispatch

  {

  };

[

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

  version(1.0),

  helpstring("ValidateCreditCardServer 1.0 Type Library")

]

library VALIDATECREDITCARDSERVERLib

{

  importlib("stdole32.tlb");

  importlib("stdole2.tlb");

  [

  uuid(C79635D2-7B86-4B20-A83C-0565DCA54C3C),

  helpstring("ValidateCard Class")

  ]

  coclass ValidateCard

  {

  [default] interface IValidateCard;

  };

};

 


文中黑體部分表示在中加入元件類後形成的程式碼,在框架中加入元件類之前,只有型別庫部分,而在建立元件類後我們可以看到上面部分是一個元件類的介面,下面部分是一個元件類,其巢狀在型別庫中。呵呵,三部分全到齊了。

另外,也說明一下VALIDATECREDITCARDSERVERLib這幾個字母的用處,大家想到沒有呀?呵呵,它就是在客戶端中使用名字空間時使用的呀。詳細請見Visual C++Visual C++元件

3.  增加元件的功能。

要實現這一點,你必須增加檢驗信用卡有效性的。如何增加函式到你的元件,請按以下步驟操作:

在 VC++工作平臺的左邊的 Workspace 的 ClassView 卡片中找到介面 IValidateCard項,按右鍵,在出現的快捷選單中選擇 Add  Method …,出現 Add  Method  to Interface 對話方塊,在對話方塊中輸入要增加的函式的函式名、引數和返回值型別。在這裡,我們在Method Name中輸入

ValidateCreditCard

在Parameters中輸入

[in] BSTR bstrCCNo,[in]BSTR bstrCCType,[out,retval]long *val

然後,按確認按鈕退出。

類似地輸入以下三個函式

函式功能

Method Name

Parameters

檢驗信用卡的號碼是否合法

LuhnCheck

[in] BSTR bstrCCNo,[in]BSTR bstrCCType

檢驗信用卡的長度是否合法

LengthCheck

[in] BSTR bstrCCNo,[in]BSTR bstrCCType

檢驗信用卡的型別是否合法

PrefixCheck

[in] BSTR bstrCCNo,[in]BSTR bstrCCType

現在你可以看見為你的元件建立的介面定義語言檔案的變化,你將在IDL檔案ValidateCreditCardServer.idl中看到上面增加的所有函式的入口。

 

ValidateCreditCardServer.idl清單


// ValidateCreditCardServer.idl : IDL 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";

  [

  object,

  uuid(B1D1C73C-E340-4FDC-8734-92ECEC64DC4E),

  dual,

  helpstring("IValidateCard Interface"),

  pointer_default(unique)

  ]

  interface IValidateCard : IDispatch

  {

  [id(1), helpstring("method ValidateCreditCard")] HRESULT ValidateCreditCard([in] BSTR bstrCCNo,[in]BSTR bstrCCType,[out,retval]long *val );

  [id(2), helpstring("method LuhnCheck")] HRESULT LuhnCheck([in] BSTR bstrCCNo,[in]BSTR bstrCCType);

  [id(3), helpstring("method LengthCheck")] HRESULT LengthCheck([in] BSTR bstrCCNo,[in]BSTR bstrCCType);

  [id(4), helpstring("method PrefixCheck")] HRESULT PrefixCheck([in] BSTR bstrCCNo,[in]BSTR bstrCCType);

  };

...


另外它也在元件類的實現類的標頭檔案ValidateCard.h和實現檔案ValidateCard.cpp中分別加入函式的入口。

 


// ValidateCard.h : Declaration of the CValidateCard

#ifndef __VALIDATECARD_H_

#define __VALIDATECARD_H_

#include "resource.h"  // main symbols

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

// CValidateCard

class ATL_NO_VTABLE CValidateCard :

  public CComObjectEx,

  public CComCoClass,

  public IDispatchImpl

{

public:

  CValidateCard()

  {

  }

DECLARE_REGISTRY_RESOURCEID(IDR_VALIDATECARD)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CValidateCard)

  COM_INTERFACE_ENTRY(IValidateCard)

  COM_INTERFACE_ENTRY(IDispatch)

END_COM_MAP()

// IValidateCard

public:

  STDMETHOD(PrefixCheck)(/*[in]*/ BSTR bstrCCNo,/*[in]*/BSTR bstrCCType);

  STDMETHOD(LengthCheck)(/*[in]*/ BSTR bstrCCNo,/*[in]*/BSTR bstrCCType);

  STDMETHOD(LuhnCheck)(/*[in]*/ BSTR bstrCCNo,/*[in]*/BSTR bstrCCType);

  STDMETHOD(ValidateCreditCard)(/*[in]*/ BSTR bstrCCNo,/*[in]*/BSTR bstrCCType,/*[out,retval]*/long *val);

};

#endif //__VALIDATECARD_H_


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


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

相關文章