VC下的DLL如下:
头文件如下:
typedef struct ReadCheckCard{
unsigned long  UserCode_Card;
 int isydl_Card;
 int iaddgdl_Card;
 int iusedl_Card;
 int itimes_Card;
 int iMaxNum_Card;
 int iDownNum_Card;
 int iMinNum_Card;
 unsigned long  FixtureCode_Card;
 int ErrorNum_Card;
} MyReadCheckCard;
int __declspec(dllexport) __stdcall ReadCheckCardInfo(MyReadCheckCard * mc) {
    
DWORD return_code;
    BYTE _bATR[4];
BYTE _bFuse[1];
    BYTE _bReadData[3];
    DWORD *_dwValue;
mc->ErrorNum_Card=0; //初始化
return_code=MCS_SetStringMode(0);
if(return_code!=0){
mc->ErrorNum_Card=1;
return mc->ErrorNum_Card;
  }
  
//卡上电操作
return_code=AT153_OpenCard(_bATR);
if(return_code!=0){
mc->ErrorNum_Card=2;
return mc->ErrorNum_Card;
  }   //读卡操作
return_code=AT153_ReadATR(_bATR);
if(return_code!=0){
mc->ErrorNum_Card=3;
return FALSE; }
if(_bATR[0]!=0x2C && _bATR[1]!=0xAA && _bATR[2]!=0x55 && _bATR[3]!=0xA1)
{
mc->ErrorNum_Card=4;
return mc->ErrorNum_Card;
} //判断熔丝;
return_code=AT153_ReadFuse(_bFuse);
if(return_code!=0){
mc->ErrorNum_Card=5;
return mc->ErrorNum_Card; }
if(_bFuse[0]!=6)           //实际应为6;
{
mc->ErrorNum_Card=6;
return mc->ErrorNum_Card;
} //读用户户号
DWORD m_seluser; _dwValue=&m_seluser; return_code=AT153_ReadValue(0x1F,2,_dwValue);
if(return_code!=0){
        mc->ErrorNum_Card=1;
   return mc->ErrorNum_Card; }
else {mc->UserCode_Card =*_dwValue; }
     
    //读剩余电量
return_code=AT153_ReadChar(0x11,3,2,_bReadData);
if(return_code!=0){
mc->ErrorNum_Card=1;
return mc->ErrorNum_Card; }
else{ mc->isydl_Card=_bReadData[0]+_bReadData[1]*256+_bReadData[2]*65536; }
//读累计购电量
    BYTE _bReadData1[3];
return_code=AT153_ReadChar(0x14,3,2,_bReadData1);
if(return_code!=0){
mc->ErrorNum_Card=1;
return mc->ErrorNum_Card; }
else{ mc->iaddgdl_Card=_bReadData1[0]+_bReadData1[1]*256+_bReadData1[2]*65536; } //读累计用电量
BYTE _bReadData2[3];
return_code=AT153_ReadChar(0x17,3,2,_bReadData2);
if(return_code!=0){
mc->ErrorNum_Card=1;
return mc->ErrorNum_Card; }
else{mc->iusedl_Card =_bReadData2[0]+_bReadData2[1]*256+_bReadData2[2]*65536; }
   
   //读购电次数
BYTE _bReadData3[3];
return_code=AT153_ReadChar(0x24,2,2,_bReadData3);
if(return_code!=0){
mc->ErrorNum_Card=1;
return mc->ErrorNum_Card; }
else{ mc->itimes_Card =_bReadData3[0]+_bReadData3[1]*256; }       //读囤积电量
return_code=AT153_ReadChar(0x08,3,2,_bReadData);
if(return_code!=0){
mc->ErrorNum_Card=1;
return mc->ErrorNum_Card; }
else{ mc->iMaxNum_Card =_bReadData[0]+_bReadData[1]*256+_bReadData[2]*65536;}
           //读报警电量1
return_code=AT153_ReadChar(0x0b,3,2,_bReadData);
if(return_code!=0){
     mc->ErrorNum_Card=1;
return mc->ErrorNum_Card; }
else{ mc->iDownNum_Card =_bReadData[0]+_bReadData[1]*256+_bReadData[2]*65536;}
//读报警电量2
return_code=AT153_ReadChar(0x0e,3,2,_bReadData);
if(return_code!=0){
    mc->ErrorNum_Card=1;
    return mc->ErrorNum_Card; }
else{mc->iMinNum_Card =_bReadData[0]+_bReadData[1]*256+_bReadData[2]*65536;}
   //读电表编号 return_code=AT153_ReadValue(0x1a,2,_dwValue);
if(return_code!=0){
mc->ErrorNum_Card=1;
return mc->ErrorNum_Card; }
else{ mc->FixtureCode_Card=*_dwValue;}
return_code=AT153_CloseCard();
if(return_code!=0){
mc->ErrorNum_Card=1;
return mc->ErrorNum_Card;
}
else{return mc->ErrorNum_Card;}}
VB中调用代码如下:
声明:
Public Declare Function ReadCheckCardInfo Lib "test" (ReadCheck As MyReadCheckCard) As Integer Public Type MyReadCheckCard       FixtureCode_Card As String * 10
       iMinNum_Card  As Long
       iDownNum_Card As Long
       iMaxNum_Card  As Long       iTimes_Card   As Long
       iUseNum_Card  As Long
       iaddgdl_Card  As Long
     
       isydlNum_Card As Long
       UserCode_Card As String * 10
        ErrorNum_Card As LongEnd Type
调用:
Dim iNum         As Integer
Dim Read_Check   As MyReadCheckCard
 Read_Check.ErrorNum_Card = 0
 Read_Check.UserCode_Card = ""
 Read_Check.isydlNum_Card = 0:
 Read_Check.iaddgdl_Card = 0:
 Read_Check.iUseNum_Card = 0:
 Read_Check.iTimes_Card = 0:
 Read_Check.iMaxNum_Card = 0:
 Read_Check.iDownNum_Card = 0:
 Read_Check.iMinNum_Card = 0
 Read_Check.FixtureCode_Card = ""
 iNum = ReadCheckCardInfo(Read_Check)问:这些返回值的次序不对,请问各位有什么办法?在此多谢了!!!!