dll中:(入口函数略)
extern "C"__declspec( dllexport )char * GetCIDCLocation(char CIdC[])
{
char cLocation[50], cLoc,cCIDCode[7],CIdC6[7];
int i;
CIdC6[0]='\0';
cLocation[0]='\0';
strncat(CIdC6,CIdC,6);
FILE * fp;
fp=fopen("e:\\CIDCLocation.dat","r");
if (fp==NULL)
{
MessageBox(NULL,"Can not find <CIDCLocation.dat>","Error",MB_OK);
return NULL;
}
while(!feof(fp))
{
fread(&cLoc,sizeof(char),1,fp);
if(isdigit(cLoc) && cLoc>=0)
{
cCIDCode[0]=cLoc;
for(i=1;i<=5;i++)
{
fread(&cLoc,sizeof(char),1,fp);
cCIDCode[i]=cLoc;
}
cCIDCode[6]='\0';
if(strcmp(cCIDCode,CIdC6)!=0)
{
continue;
}
else
{
i=0;
do
{
fread(&cLoc,sizeof(char),1,fp);
if(!isdigit(cLoc) || cLoc<0)
{
cLocation[i++]=cLoc;
}
else
{
cLocation[i]='\0';
return cLocation;
}
}
while(!feof(fp));
}
}
}
return NULL;
}
extern "C"__declspec( dllexport )int  CheckCIDC(char CIdC[])
{
if(strlen(CIdC)==15)
{
return Check15CIDC(CIdC);
}
if(strlen(CIdC)==18)
{
return Check18CIDC(CIdC);
}
return CIDC_CH_WRONG_LEN;
}
int  Check15CIDC(char CIdC[])
{
int i,iMon,iDay,iYear;
char cMon[3],cDay[3],cYear[3];
for(i=0;i<15;i++)
{
if(CIdC[i]>'9' || CIdC[i]<'0')
{//有非数字出现
return CIDC_CH_NOT_DIGIT;
}
}
cYear[0]=CIdC[6];
cYear[1]=CIdC[7];
cYear[2]='\0';
iYear=atoi(cYear);
cMon[0]=CIdC[8];
cMon[1]=CIdC[9];
cMon[2]='\0';
iMon=atoi(cMon);
cDay[0]=CIdC[10];
cDay[1]=CIdC[11];
cDay[2]='\0';
iDay=atoi(cDay);
if(iMon==0 || iMon>12)
{ //错误的月份
return CIDC_CH_WRONG_MONTH;
}
if(iDay==0 || iDay>31)
{ //错误的日期
return CIDC_CH_WRONG_DAY;
}
if((iMon==4 || iMon==6 || iMon==9 || iMon==11) && iDay==31)
{ //月份日期不匹配
return CIDC_CH_WRONG_MONTH_DAY;
}
if(iMon==2 && iDay>29)
{ //2月份日期不正确
return CIDC_CH_WRONG_MONTH_DAY;
}
if((IsLeapYear(1900+iYear) && iMon==2 && iDay!=29) || (!IsLeapYear(1900+iYear) && iMon==2 && iDay==29) )
{
return CIDC_CH_WRONG_YEAR_MONTH_DAY;
}
if(GetCIDCLocation(CIdC)==NULL)
{
return CIDC_CH_UNKNOWN_LOCATION;
}
return CIDC_CH_OK; 
}
int  Check18CIDC(char CIdC[])
{
int i,iMon,iDay,iYear;
char cMon[3],cDay[3],cYear[5];
for(i=0;i<17;i++)
{
if(CIdC[i]>'9' || CIdC[i]<'0')
{//有非数字出现
return CIDC_CH_NOT_DIGIT;
}
}
cYear[0]=CIdC[6];
cYear[1]=CIdC[7];
cYear[2]=CIdC[8];
cYear[3]=CIdC[9];
cYear[4]='\0';
iYear=atoi(cYear);
cMon[0]=CIdC[10];
cMon[1]=CIdC[11];
cMon[2]='\0';
iMon=atoi(cMon);
cDay[0]=CIdC[12];
cDay[1]=CIdC[13];
cDay[2]='\0';
iDay=atoi(cDay);
if(iMon==0 || iMon>12)
{ //错误的月份
return CIDC_CH_WRONG_MONTH;
}
if(iDay==0 || iDay>31)
{ //错误的日期
return CIDC_CH_WRONG_DAY;
}
if((iMon==4 || iMon==6 || iMon==9 || iMon==11) && iDay==31)
{ //月份日期不匹配
return CIDC_CH_WRONG_MONTH_DAY;
}
if(iMon==2 && iDay>29)
{ //2月份日期不正确
return CIDC_CH_WRONG_MONTH_DAY;
}
if((IsLeapYear(iYear) && iMon==2 && iDay!=29) || (!IsLeapYear(iYear) && iMon==2 && iDay==29) )
{
return CIDC_CH_WRONG_YEAR_MONTH_DAY;
}
if(GetCIDCLocation(CIdC)==NULL)
{
return CIDC_CH_UNKNOWN_LOCATION;
}
return CIDC_CH_OK; 
}
bool IsLeapYear(int iYear)
{
if((iYear%4==0 && iYear%100!=0) || iYear%400==0)
{
return true;
}
return false;
}
exe中:
int i;
char CIDC[19];
strcpy(CIDC,"220204790328121");
typedef int(* CheckCIDC)(char[]);
CheckCIDC * CheckCIdC;
gLibMyDLL=LoadLibrary("E:\\MySystem\\exercise\\CIDC\\Release\\CIDC.DLL");
CheckCIdC=(CheckCIDC*)GetProcAddress(gLibMyDLL,"CheckCIDC");
if(CheckCIdC)
{
i=(*CheckCIdC)(CIDC);
}
执行是出错:
Unhandled exception in test.exe:0xC0000005:Access Violation
这是怎么回事呀?是dll出错?还是exe出错?
我曾把dll中的代码写在exe中执行,没有问题呀?

解决方案 »

  1.   

    debug to see where the error occurs
      

  2.   

    调试跟踪,看在dll中的哪一语句出错.
      

  3.   

    我试过了,但我跟踪不进去dll呀?怎么能让exe和dll一起调试呀?
      

  4.   

    dll没错
    exe中错了
    typedef int(* CheckCIDC)(char[]);
    CheckCIDC CheckCIdC;
    gLibMyDLL=LoadLibrary("E:\\MySystem\\exercise\\CIDC\\Release\\CIDC.DLL");
    CheckCIdC=(CheckCIDC)GetProcAddress(gLibMyDLL,"CheckCIDC");
    if(CheckCIdC)
    {
    i=CheckCIdC(CIDC);
    }
    你把指针和指针的指针搞混乱了