#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
#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
String BSTR, LPCTSTR
Byte char
Integer short,WORD
Long int,DWORD,
Single float
Double Double
Boolean BOOL
Variant VARIANT
绝大多数SDK函数中的参数通常在VB中都是Long
Public Declare Function OpenComProt Lib "IcCardDll.dll" (ByVal szPortName As String) As Long
执行
Dim strHandle As Long
strHandle = OpenComProt(1)
的时候为什么会提示:
“DLL调用约定错误”
????
请问为什么呢?急,谢谢!!!!!!!!!!!!!!!!
把Byval去掉试试。
然后再OpenComProt(1)
请各位帮帮忙,解决这个问题我愿意多给分,谢谢了!!!!急!!!!!
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
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;
}
Dim strHandle As Long
strHandle = OpenComProt("Com1:")
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
{
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;
}