能不能干了
// CardCheck.cpp : Implementation of CCardCheck
#include "stdafx.h"
#include "CardCheck.h"
#include ".\cardcheck.h"
// CCardCheck
STDMETHODIMP CCardCheck::get_CardType(BSTR* pVal)
{
// TODO: Add your implementation code here
*pVal=SysAllocString(bstrCardType);
return S_OK;
}
STDMETHODIMP CCardCheck::put_CardType(BSTR newVal)
{
// TODO: Add your implementation code here
bstrCardType=SysAllocString(newVal);
return S_OK;
}
STDMETHODIMP CCardCheck::Validate(BSTR* bstrCardNo, VARIANT* vRetVal)
{
// TODO: Add your implementation code here
int i;
int nSum;
//convert the card number from bstr to char*
int len=wcslen(bstrCardNo); //这出错啦
char * pszCardNo=new char[len+1];
int last=WideCharToMultiByte //这出错啦(CP_ACP,0,bstrCardNo,len,pszCardNo,len,0,0);
pszCardNo[last]=0;
//convert the card type from bstr to char*
len=wcslen(bstrCardType);
char * pszCardType=new char[len+1];
last=WideCharToMultiByte(CP_ACP,0,bstrCardType,len,pszCardType,len,0,0);
pszCardType[last]=0;
CString s(pszCardType);
//check if one of the acceptd card types
if(s.CompareNoCase("VISA")!=0&&s.CompareNoCase("MASTER")!=0&&s.CompareNoCase("AMEX")!=0)
{
CComVariant n(1);
*vRetVal=(VARIANT)n;
return S_OK;
}
//check if the card number is valid for visa
if (s.CompareNoCase("VISA")==0)
{
if(strlen(pszCardNo)!=13&&strlen(pszCardNo)!=16)
{
CComVariant n(1);
*vRetVal=(VARIANT)n;
return S_OK;
}
if(pszCardNo[0]!='4')
{
CComVariant n(1);
*vRetVal=(VARIANT)n;
return S_OK;
}
}
//check if the card number is valid for master
if(s.CompareNoCase("MASTER")==0)
{
if(strlen(pszCardNo)!=16)
{
CComVariant n(1);
*vRetVal=(VARIANT)n;
return S_OK;
}
if(pszCardNo[0]!='5')
{
CComVariant n(1);
*vRetVal=(VARIANT)n;
return S_OK;
}
if(pszCardNo<'1'||pszCardNo>'6')
{
CComVariant n(1);
*vRetVal=(VARIANT)n;
return S_OK;
}
}
//check if the number is valid for Amex
if(s.CompareNoCase("AMEX")==0)
{
if(strlen(pszCardNo)!=15)
{
CComVariant n(1);
*vRetVal=(VARIANT)n;
return S_OK;
}
if(pszCardNo[0]!='3')
{
CComVariant n(1);
*vRetVal=(VARIANT)n;
return S_OK;
}
if(pszCardNo!='4'&&pszCardNo!='7')
{
CComVariant n(1);
*vRetVal=(VARIANT)n;
return S_OK;
}
}
//check if the card number is valid luhn number
for(i=0,nSum=0;i<16;i+=2)
{
int nDigit=(pszCardNo[i]-48)*2;
if(nDigit<10)
{
nSum=nSum+nDigit;
}
else
{
nSum=nSum+nDigit/10;
nSum=nSum+nDigit%10;
}
nSum=nSum+(pszCardNo[i+1]-48);
}
nSum=nSum%10;
CComVariant p(nSum);
*vRetVal=(VARIANT)p;
return S_OK;
}
提示错误是下面提示
d:\LuhnChecker\CardCheck.cpp(33): error C2664: 'wcslen' : cannot convert parameter 1 from 'BSTR * ' to 'const wchar_t *'
d:\LuhnChecker\CardCheck.cpp(35): error C2664: 'WideCharToMultiByte' : cannot convert parameter 3 from 'BSTR * ' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast