ITPub博客

首页 > 应用开发 > IT综合 > Developing COM Components using VC-ATL(3-5) (转)

Developing COM Components using VC-ATL(3-5) (转)

原创 IT综合 作者:amyz 时间:2007-08-17 10:54:28 0 删除 编辑
Developing COM Components using VC-ATL(3-5) (转)[@more@]

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

4.  编写实现函数功能的代码

 

 ValidateCard.cpp清单

 


  // ValidateCard.cpp : Implementation of CValidateCard

#include "stdafx.h"

#include "ValidateCreditCardServer.h"

#include "ValidateCard.h"

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

// CValidateCard

STDMETHODIMP CValidateCard::ValidateCreditCard(BSTR bstrCCNo, BSTR bstrCCType, long *val)

{

  AFX_MANAGE_STATE(AfxGetStaticModuleState())

  // TODO: Add your implementation code here

  CString strType(bstrCCType);

  strType.MakeUpper();

  if(strType.Compare("VISA")==0)

  bstrCCType=SysAllocString(OLESTR("V"));

  else if(strType.Compare("MASTER")==0)

  bstrCCType=SysAllocString(OLESTR("M"));

  else if(strType.Compare("AMERICAN")==0)

  bstrCCType=SysAllocString(OLESTR("A"));

  else

  {

  *val=0;

  return S_FALSE;

  }

  if((PrefixCheck(bstrCCNo,bstrCCType)==S_OK) && (LengthCheck(bstrCCNo,bstrCCType)==S_OK) && (LuhnCheck(bstrCCNo,bstrCCType)==S_OK))

  {

  *val=1;

  return S_OK;

  }

  else

  {

  *val=0;

  return S_FALSE;

  }

  return S_FALSE;

}

STDMETHODIMP CValidateCard::LuhnCheck(BSTR bstrCCNo, BSTR bstrCCType)

{

  AFX_MANAGE_STATE(AfxGetStaticModuleState())

  // TODO: Add your implementation code here

  CString strobj(bstrCCNo);

  CString strReverse,strFinal;

  int iNum,iSum;

  char cTemp;

  strReverse=strobj;

  strReverse.MakeReverse();

  for(int iTemp=0;iTemp

  {

  cTemp=strReverse.GetAt(iTemp);

  iNum=atoi(&cTemp);

  if(iTemp % 2 !=0)

  {

  iNum=iNum*2;

  if(iNum>9)

  iNum-=9;

  }

  cTemp=iNum+'0';

  strFinal+=cTemp;

  }

  for(iTemp=0;iTemp

  {

  cTemp=strFinal.GetAt(iTemp);

  iSum+=atoi(&cTemp);

  }

  if(iSum % 10 == 0)

  return S_OK;

  else

  return S_FALSE;

}

STDMETHODIMP CValidateCard::LengthCheck(BSTR bstrCCNo, BSTR bstrCCType)

{

  AFX_MANAGE_STATE(AfxGetStaticModuleState())

  // TODO: Add your implementation code here

  CString strType(bstrCCType),strLength(bstrCCNo);

  int ilen=strLength.GetLength();

  if(strType=="V")

  {

  if(ilen==16)return S_OK;

  }

  else if(strType=="M")

  {

  if(ilen==16)return S_OK;

  }

  else if(strType=="A")

  {

  if(ilen==15)return S_OK;

  }

  return S_FALSE;

}

STDMETHODIMP CValidateCard::PrefixCheck(BSTR bstrCCNo, BSTR bstrCCType)

{

  AFX_MANAGE_STATE(AfxGetStaticModuleState())

  // TODO: Add your implementation code here

  CString strNumber(bstrCCNo),strType(bstrCCType);

  if(strType=="V")

  {

  if(strNumber.Find("4",0)>=0)

  return S_OK;

  }

  else if(strType=="M")

  {

  if(strNumber.Find("51",0)>=0 || strNumber.Find("52",0)>=0 || strNumber.Find("53",0)>=0 || strNumber.Find("54",0)>=0)

  return S_OK;

  }

  else if(strType=="A")

  {

  if(strNumber.Find("34",0)>=0 || strNumber.Find("37",0)>=0)

  return S_OK;

  }

  return S_FALSE;

}


5.  编绎组件

编绎会读取ValidateCard.rgs文件进行组件的自动注册,若在windows 9X环境下,请运行regsvr32程序进行注册,具体参见

Developing com Components using VC-ATL(2-3) COM对象的注册角色

同时编绎完成后,会

在Debug目录下生成ValidateCreditCardServer.dll

在Debug上一层目录下,即工程名工作空间目录下生成ValidateCreditCardServer.tlb

这两个文件都可以导入到客户端,测试时分别会介绍这两种方法。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10752019/viewspace-963663/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    3982
  • 访问量
    7896812