#ifndef __ICCARDDLL_H__
#define __ICCARDDLL_H__#define DllImport __declspec(dllimport)
#define DllExport __declspec(dllexport)//错误码
#define ERROR_OK 0
#define ERROR_WRITE -1
#define ERROR_READ -2
#define ERROR_BCC -3
#define ERROR_RESPONE_DATA -4//IC卡状态字,其范围在1到0XFF之间的任何值。要知道其实际的含义,
//请查找ic卡的说明书。#ifdef __cplusplus
extern "C" {
#endif
/*HANDLE OpenComProt(char* szPortName)
描述:打开制定的COM口,如COM1,COM2等。
参数说明:szPortName指定要打开的COM口。
返回值:如果成功,返回一个有效的HANDLE,否则,返回NULL。
*/
DllExport HANDLE OpenComProt(char* szPortName);

/*BOOL CloseComProt(HANDLE hComm)
描述:关闭hComm指定的端口。
参数说明:hComm:打开端口时返回的HANDLE.
返回值:如果成功关闭,返回TRUE,否则,返回FALSE。
*/
DllExport BOOL CloseComProt(HANDLE hComm);

/* DWORD PowerOn(HANDLE hComm)
描述:给IC卡上电。
参数说明:hComm:打开端口时返回的HANDLE.
返回值:如果成功返回ERROR_OK,否则,返回一个错误的代码或ic卡的状态字。
*/
DllExport DWORD PowerOn(HANDLE hComm); /* DWORD PowerOff(HANDLE hComm)
描述:给IC卡下电
参数说明:hComm:打开端口时返回的HANDLE.
返回值:如果成功返回ERROR_OK,否则,返回一个错误的代码或ic卡的状态字。
*/
DllExport DWORD PowerOff(HANDLE hComm);

/* BOOL IsCardPresent(HANDLE hComm,int* piCardStatus)
描述:查询是否插卡
参数说明:hComm:打开端口时返回的HANDLE.
piCardStatus:保存卡的状态
返回值:如果成功返回TRUE,否则,返回FALSE。
*/
DllExport BOOL IsCardPresent(HANDLE hComm,int* piCardStatus);

/* DWORD MakeBeep(HANDLE hComm,int iType)
描述:控制蜂鸣器响声
参数说明:hComm:打开端口时返回的HANDLE.
iType:响声类型。0:表示一声,1:表示两声。其它是无效值。
返回值:如果成功返回ERROR_OK,否则,返回一个错误的代码或ic卡的状态字。
*/
DllExport DWORD MakeBeep(HANDLE hComm,int iType); /* DWORD GetICVersion(HANDLE hComm, char szVersion[256],int* piDataReturn)
描述:读取IC卡的版本信息。
参数说明:hComm:打开端口时返回的HANDLE.
szVersion:如果读取成功,保存IC卡的版本说明。
piDataReturn:版本说明的长度。
返回值:如果成功返回ERROR_OK,否则,返回一个错误的代码或ic卡的状态字。
*/
DllExport DWORD GetICVersion(HANDLE hComm, char szVersion[256],int* piDataReturn);

/* DWORD DWORD ReadData(HANDLE hComm,unsigned char* psBuf,size_t sLen,UCHAR iAddress,UCHAR iMemoryType,size_t *sRetLen)
描述:读取IC卡内存的数据
参数说明:hComm:打开端口时返回的HANDLE.
psBuf:如果读取成功,保存从IC卡读回的数据。
sLen:要读取数据的长度。
iAddress:开始地址。
iMemoryType:内存的类型:=0 (写主存储区)
 =1 (写保护存储区)
 =2 (写加密存储区)
sRetLen:实际读回的数据长度。
返回值:如果成功返回ERROR_OK,否则,返回一个错误的代码或ic卡的状态字。
*/
DllExport DWORD ReadData(HANDLE hComm,unsigned char* psBuf,size_t sLen,UCHAR iAddress,UCHAR iMemoryType,size_t *sRetLen); /* DWORD WriteData(HANDLE hComm,unsigned char* psBuf,size_t sLen,UCHAR iAddress,UCHAR iMemoryType)
描述:读取IC卡的版本信息。
参数说明:hComm:打开端口时返回的HANDLE.
psBuf:要写到IC卡数据。
sLen:数据的长度。
iAddress:开始地址。
iMemoryType:内存的类型:=0 (写主存储区)
=1 (写保护存储区)
=2 (写加密存储区)
返回值:如果成功返回ERROR_OK,否则,返回一个错误的代码或ic卡的状态字。
*/
DllExport DWORD WriteData(HANDLE hComm,unsigned char* psBuf,size_t sLen,UCHAR iAddress,UCHAR iMemoryType); /* DWORD CheckPassword(HANDLE hComm,unsigned char szData[3])
描述:校验IC卡密码。
参数说明:hComm:打开端口时返回的HANDLE.
szData:为输入的密码数据,3个字节
返回值:如果成功返回ERROR_OK,否则,返回一个错误的代码或ic卡的状态字。
*/
DllExport DWORD CheckPassword(HANDLE hComm,unsigned char szData[3]);

/* DWORD ChangePassword(HANDLE hComm,unsigned char szData[3])
描述:更改IC卡密码。
参数说明:hComm:打开端口时返回的HANDLE.
szData:为输入的密码数据,3个字节
返回值:如果成功返回ERROR_OK,否则,返回一个错误的代码或ic卡的状态字。
*/
DllExport DWORD ChangePassword(HANDLE hComm,unsigned char szData[3]);

#ifdef __cplusplus
}
#endif#endif

解决方案 »

  1.   

    HANDLE OpenComProt(char*   szPortName) BOOL CloseComProt(HANDLE   hComm) DWORD PowerOn(HANDLE hComm)DWORD PowerOff(HANDLE hComm)BOOL  IsCardPresent(HANDLE hComm,int* piCardStatus)DWORD MakeBeep(HANDLE hComm,int iType)DWORD GetICVersion(HANDLE hComm, char szVersion[256],int* piDataReturn)DWORD DWORD ReadData(HANDLE hComm,unsigned char* psBuf,size_t sLen,UCHAR iAddress,UCHAR iMemoryType,size_t *sRetLen)DWORD WriteData(HANDLE hComm,unsigned char* psBuf,size_t sLen,UCHAR iAddress,UCHAR iMemoryType)DWORD CheckPassword(HANDLE hComm,unsigned char szData[3])DWORD ChangePassword(HANDLE hComm,unsigned char szData[3])就这几个函数。
      

  2.   

    VC中的DWORD     和VB 中的DWORD   不一样
      

  3.   

      VB,          VC   
      String       BSTR,   LPCTSTR   
      Byte         char   
      Integer      short,WORD   
      Long         int,DWORD,   
      Single       float   
      Double       Double   
      Boolean      BOOL   
      Variant      VARIANT   
        
      绝大多数SDK函数中的参数通常在VB中都是Long   
      

  4.   

    那为什么我第一个函数的定义
    Public Declare Function OpenComProt Lib "IcCardDll.dll" (ByVal szPortName As String) As Long
    执行
    Dim strHandle As Long
    strHandle = OpenComProt(1)
    的时候为什么会提示:
    “DLL调用约定错误”
    ????
    请问为什么呢?急,谢谢!!!!!!!!!!!!!!!!
      

  5.   

    strHandle = OpenComProt(1) 还是 strHandle = OpenComProt("1") ?Public   Declare   Function   OpenComProt   Lib   "IcCardDll.dll "   (szPortName   As   String)   As   Long ,
    把Byval去掉试试。
      

  6.   

    首先看看是端口号还是端口名字,这个只能在有硬件的基础上面调试,szPortName  as integer试试呢
    然后再OpenComProt(1)
      

  7.   

    各位,无论用何种办法都是提示“DLL调用约定错误” ,我估计暂时还不是传入参数的内容问题,而函数调用定义问题。
    请各位帮帮忙,解决这个问题我愿意多给分,谢谢了!!!!急!!!!!
      

  8.   

    HANDLE OpenComProt(char* szPortName)
    szPortName是指针
    ------------------------------------Private Declare Function OpenComProt Lib "IcCardDll.dll " (ByRef ptrszPortName As Long) As LongPrivate Sub Form_Load()
      Dim ret&, szPortName$
      szPortName$ = 1
      ret = VarPtr(szPortName)
      '''Debug.Print ret
      ret = OpenComProt(ret)
    End Sub
      

  9.   

    楼上,对不起,到了
    ret = OpenComProt(ret)
    还是报
    “DLL调用约定错误”
    我现在把API中的OpenComProt函数代码粘出来大家看看,谢谢大家了,我都觉得很奇怪的。
    HANDLE OpenComProt(char* szPortName)
    {
    HANDLE hComm = CreateFile(szPortName,   // 
    GENERIC_WRITE|GENERIC_READ,
    NULL,NULL,
    OPEN_EXISTING,
    NULL ,//FILE_FLAG_OVERLAPPED|FILE_ATTRIBUTE_NORMAL ,NULL,
    NULL);
    if(hComm!=INVALID_HANDLE_VALUE)
    {
    COMMTIMEOUTS timeouts;

    timeouts.ReadIntervalTimeout = MAXDWORD; 
    timeouts.ReadTotalTimeoutMultiplier = 0;
    timeouts.ReadTotalTimeoutConstant = 0;
    timeouts.WriteTotalTimeoutMultiplier = 0;
    timeouts.WriteTotalTimeoutConstant = 0;
    SetCommTimeouts(hComm, &timeouts); SetCommMask(hComm , EV_RXCHAR); SetupComm(hComm , 1024 ,1024);
    DCB dcb={0,};
    dcb.DCBlength = sizeof(DCB);
    dcb.BaudRate = 9600;
    dcb.ByteSize = 8;
    dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT;
    dcb.fBinary = TRUE;
    dcb.fParity = false;
    SetCommState(hComm,&dcb);
    PurgeComm(hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT); return hComm; }
    return NULL;
    }
      

  10.   

    private  Declare   Function   OpenComProt   Lib   "IcCardDll.dll "   (ByVal   szPortName   As   String)   As   Long 
    Dim   strHandle   As   Long 
    strHandle   =   OpenComProt("Com1:") 
      

  11.   

    你的 C 代码没有写成 __stdcall 调用规约,VB 无法以缺省方式调用。与你的声明没有关系。你有三条路可走:1 如果 DLL C 代码是你写的,改成 __stdcall。
    2 用 C 再写一个接口 DLL, 函数写成 __stdcall,并直接调用原来的 DLL。这是你最可能走的路。
    3 用 VB 访问 cdecl DLL, 比较麻烦,下面是一个例子:写一个类模块:Imports System
    Imports Microsoft.VisualBasic
    Imports System.Runtime.InteropServices
    Public Class LibWrap
    ' Visual Basic does not support varargs, so all arguments must be 
    ' explicitly defined. CallingConvention.Cdecl must be used since the stack 
    ' is cleaned up by the caller. 
    ' int printf( const char *format [, argument]... )
    <DllImport("msvcrt.dll", CallingConvention := CallingConvention.Cdecl)> _
    Overloads Shared Function printf ( _
        format As String, i As Integer, d As Double) As Integer
    End Function
    <DllImport("msvcrt.dll", CallingConvention := CallingConvention.Cdecl)> _
    Overloads Shared Function printf ( _
        format As String, i As Integer, s As String) As Integer
    End Function
    End Class 'LibWrap
    Public Class App
        Public Shared Sub Main()
            LibWrap.printf(ControlChars.CrLf + "Print params: %i %f", 99, 
                           99.99)
            LibWrap.printf(ControlChars.CrLf + "Print params: %i %s", 99, _
                           "abcd")
        End Sub 'Main
    End Class 'App
      

  12.   

    HANDLE __stdcall OpenComProt(char*   szPortName) 

    HANDLE hComm   =   CreateFile(szPortName,       //   
    GENERIC_WRITE ¦GENERIC_READ, 
    NULL,NULL, 
    OPEN_EXISTING, 
    NULL   ,//FILE_FLAG_OVERLAPPED ¦FILE_ATTRIBUTE_NORMAL   ,NULL, 
    NULL); 
    if(hComm!=INVALID_HANDLE_VALUE) 

    COMMTIMEOUTS   timeouts; timeouts.ReadIntervalTimeout =   MAXDWORD;   
    timeouts.ReadTotalTimeoutMultiplier =   0; 
    timeouts.ReadTotalTimeoutConstant =   0; 
    timeouts.WriteTotalTimeoutMultiplier =   0; 
    timeouts.WriteTotalTimeoutConstant =   0; 
    SetCommTimeouts(hComm,   &timeouts); SetCommMask(hComm   ,   EV_RXCHAR); SetupComm(hComm   ,   1024   ,1024); 
    DCB   dcb={0,}; 
    dcb.DCBlength   =   sizeof(DCB); 
    dcb.BaudRate   =   9600; 
    dcb.ByteSize   =   8; 
    dcb.Parity   =   NOPARITY; 
    dcb.StopBits   =   ONESTOPBIT; 
    dcb.fBinary   =   TRUE; 
    dcb.fParity   =   false; 
    SetCommState(hComm,&dcb); 
    PurgeComm(hComm,   PURGE_RXCLEAR   ¦   PURGE_TXCLEAR   ¦   PURGE_RXABORT   ¦   PURGE_TXABORT); return   hComm; } 
    return   NULL; 
    }