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

博客展示了信用卡验证组件的代码实现,包括ValidateCreditCard、LuhnCheck、LengthCheck和PrefixCheck等函数。编译组件时会读取ValidateCard.rgs文件进行自动注册,在Windows 9X环境下需运行regsvr32程序。编译完成后会生成.dll和.tlb文件,可导入客户端用于测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

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<strReverse.GetLength();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<strFinal.GetLength();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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值