怎麼樣調用外部動態連接庫,請高人相救?在delphi中怎麼調用?(50分)

K

kingson

Unregistered / Unconfirmed
GUEST, unregistred user!
這是一個考勤動態連接庫,怎麼調用:
KQCONNECT DLL

Introduction:
此动态库是以考勤机CL21-03或CL21-05 、ID、IC(LEGIC)射频卡为对象, 实现PC机与考勤机之间的通信,以及资料传送的驱动程序。 它必须使用PC机上的一个串行通讯口, 通讯的baudrate 为9600bps。
几个术语的约定:1,物理卡号:是指ID卡中固有的卡号,它是在ID卡出厂时产生。一般是不能变动的。2,逻辑卡号:是指用户映射到某张ID卡的一个数字符号,它约定为6位,当它对应于物理卡号发到考勤机中后即发生作用。(注:一个物理卡号允许对应几个逻辑卡号。但只有第一个是有效的)3,发卡名单表:它是存放在考勤机中的某一片特定存储区中的物理卡号与逻辑卡号的映射表。4,考勤记录表:它是存放在考勤机中某一特定存储区中的员工考勤打卡的记录表。

◆ SetPort 函数
◆ DestoryPort 函数
◆ ReadCardNum 函数
◆ ChangeDate 函数
◆ ChangeTime 函数
◆ ClearFlag 函数
◆ ClearName 函数
◆ ClearNameList 函数
◆ ClearRecord 函数
◆ CardSendToMachine 函数
◆ RepairAddress 函数
◆ SetClock 函数
◆ GatherData 函数
◆ 附录1-1 动态库在VB中的引用


DLL提供的接口函数及其说明:
1. Bool SetPort (PortNum As Integer)
功能: 用来打开一个串行端口, 在做所有的操作之前, 请调用此函数来设置并打开一个有效的串行端口,否则将使用动态库初始打开的串行端口。(此函数也可用来设置动态库初始端口。)

参数说明:
PortNum 是一个正整数, 表示用户想打开的串行端口号, 一般为1 或2, 如果用户扩展了PC 机的串行端口,也可以使用其它, 但是一般小于10。

Return: 如果函数打开端口成功, 将返回true, 否则返回false。

Note:在调用此函数时,请选择一个有效的端口号, ( 没被其它设备占用且存在的端口), 如果端口无效,则返回false。 打开端口成功, 则返回true,

Example:
Dim BoolFlag as Boolean
Boolflag=Object.SetPort(2):

特别提示:Object表示你在引用该动态库时建立的对象。以下各例中的object皆同于此。

2. Bool DestoryPort( ).
功能: 用来释放一个被应用程序打开的端口。如果在一个应用程序中有多个模块在调用时要打开一个已被打开的端口时,应先释放端口,然后再打开,否则该模块将无法使用此端口。

参数说明:无参数。

RETURN: 如果释放端口成功, 将返回TRUE, 否则返回FALSE。

EXAMPLE:
Dim BoolFlag as boolean
BoolFlag=Object.DestroyPort()
If boolflag then Object.SetPort(1)
……
3.String ReadCardNum(Addr as integer)
功能:用来读取考勤机中最后一次打卡的物理卡号。

参数说明:
Addr是一个正整数,表示考勤机的地址(使用者可以在打开考勤机电源时得知,它是个“1—99”之间的数字。)如果地址不正确,将无法进行通讯。特别提示:在以下函数的说明中,如果没有特别说明,Addr表示意义均相同。

RETUEN:如果成功,将返回串16位的数据串,否则返回空串。

NOTE:在返回的16位数据串中:1-2位是用十六进制表示的考勤机地址,它转换后应该等于ADDR(可以参考GatherData函数中的举例),3-4位是“07”,5-6位是“04”或“09”(它代表清除读卡标志位,“04”表示正常的卡号的标志,“09”表示已被清除的标志。使用者可以根据它来处理该数据串)7-16位是读到的卡号。

Example:
Dim Tempstr as string
Dim Addr as integer
Addr=18
Tempstr=Object.ReadCardNum(Addr)

4. Bool ChangeDate(Addr as integer,Iyear as integer,IMonth as integer,Iday as integer)
功能:用来下传日期给考勤机

参数说明:
Iyear表示下传的年份,Imonth表示下传的月份,Iday表示下传的日期

RETURN:如果下传日期成功,将返回TRUE, 否则返回FALSE。

Example:
Dim Addr as integer
Dim Iyear as integer,Imonth as integer,iday as integer
Dim BooleanFlag as Boolean
BooleanFlag=Object.ChangeDate(Addr,Iyear,Imonth,Iday)

5.Bool ChangeTime(Addr as integer,IHour as integer,IMinute as integer,ISecend as integer)
功能:用来下传时间给考勤机

参数说明:
Ihour 表示下传的小时,Iminute 表示下传的分钟,Isecend 表示下传的秒。

RETURN:如果下传时间成功,则返回TURE,否则返回 FLASE。

Example:
Dim Addr as integer
Dim Ihour as integer,Iminute as integer Isecend as integer
Dim BooleanFlage as Boolean
BooleanFlag=Object ChangeTime(Addr,Ihour,Iminute,Isecend)

6.ClearFlag(Addr as Integer)
功能:用来清除读卡标志位,在使用它来清除标志位,再用READCARDNUM去读物理卡号时,其返回值的5-6位将是“09”。(在某些要求实时采集物理卡号的系统中,将突显它的作用。)

参数说明:
Addr 意义同第三个函数中Addr。

RETURN:如果成功返回TURE,否则返回FALSE

Example:
Dim Addr as integer
Dim BooleanFlag as Boolean
BooleanFlag=Object.ClearFlag(addr)

7.Bool ClearName(Addr as Integer,TagNum as String)
功能:用来从考勤机的发卡名单中清除某张卡的逻辑卡号。

参数说明:
Addr 意义同第三个函数;TagNum 是一个“6位”的用户自定义的逻辑卡号,它传给函数时是以串的形式传递的。

RETURN :如果成功将返回TURE,否则将返回FALSE

Example:
Dim Addr as integer
Dim Num as String ,BooleanFlag as Boolean
BooleanFlag=Object.ClearName(addr,Num)

8.Bool ClearNameList(Addr)
功能:此函数用来清除考勤机中的发卡名单表。但值得特别注意的是调用它时将同时全部清除掉考勤记录表中的全部数据。所以此函数要小心使用。(它一般来用来初始化考勤机。)

参数说明:
ADDR:意义同第三个函数。

RETURN:成功返回TURE,否则返回FALSE

Example:
Dim addr as integer
Dim BooleanFlag as Boolean
BooleanFlag=Object.clearNameList(Addr)

9.Bool ClearRecord(Addr as integer)
功能:此函数用来清除考勤机中的考勤记录表,一旦使用它后,则该台考勤机中的全部考勤数据将无法恢复地被清除。所以要特别慎重使它。

参数说明:
Addr 意义同第三个函数。

Exzmple:
Dim Addr as integer
Dim BooleanFleag as Boolean
BooleanFlag=Object.ClearRecord(addr)

10.Bool CardSendToMachine(Addr as integer,CardNum as String TagNum as String)
功能:此函数将一张卡发送给一台考勤机:只有使用了该函数将卡发到了考勤机,该卡在这台考勤机才能正常打卡考勤。否则考勤机将认为是无效卡,并不接受打卡记录。

参数说明:
CardNum 它表示ID卡的物理卡号,它一般要从卡内读取,有些ID卡在出厂时,打印在卡片的上。它应该是一个“10位”的十进制串。
TagNum 是一个“6位”的用户自定义的逻辑卡号,它传给函数时是以串的形式传递的。

RETURN:当发送成功则返回TURE,否则返回FALSE。

Example:
Dim Addr as integer
Dim CardNum as string,TagNum as string
Dim BooleanFlag as Boolean
BooleanFlag=Object.CardSendtoMachine(addr,CardNum,TagNum)

11.Bool RepairAddress(OldAddress as integer,NewAddress)
功能:此函数用来修改考勤机的地址。注意它只适用于CL21-05型考勤机,而对Cl21-03型考勤机不起作用。

参数说明:
OldAddress 是指考勤机原来的地址,它是一个十进制的数。
NewAddress 是指将修改后的才考勤机新地址,它也是一个十进制的数。

RETURN 当修改成功时返回TRUE,否则返回FALSE

Example:
Dim OldAddress as integer,NewAddress as integer
Dim BooleanFlag as Boolean
BooleanFlag=Object.RepairAddress(OldAddress,NewAddress)

12.Bool SetClock(Addr as integer,Itime() as Date)
功能:考勤机具有外接打铃的功能。使用该函数可以用来设置一天之内的1-13次打铃时间表。但应该注意第一个时间点为零时,将不启用打铃功能。

参数说明:
Addr 与第三个函数相同。
Itime() 是一个日期型的一维数组,它的每个元素代表一个打铃时间点。最多只能设置13个打铃的时间点。

NOTE:使用者务必注意Itime() 数组的每个元素是以“HH:MM:SS”形式的日期数据。不要把“YY/MM/DD”格式的数据传给数组。

RETURN:设置成功返回TRUE,否则返回FALSE。

Example:
Dim Addr as integer
Dim BooleanFlag as Boolean
Dim Itime() as date

Itime(1)=cdate(#08:30#):itime(2)=cdate(#12:30#):Iteme(3)=cdate(#13:30#)
BooleanFlag=Object.setclock(addr,itime)

13.Bool GatherData(Address as integer,RecordCount1 as string,RecordCount2 as string)
功能:该函数用于采集数据,当考勤机中记录比较多时,则需要等待的时间相对较长。如果采集成功。在所调用的动态链接库的目录中,会产生一个SourceRecordSet.txt的文本文件,该文件的每行存放一条采集到的考勤记录。
参数说明:
Address 表示所要采集数据的考勤机地址,它是一个十进制的1-99之间的整数。
ReCordCount1 表示考勤机中的考勤记录笔数。(在Cl21-03中,最多能有7255条记录,在Cl21-05中,它最多能有14510条记录。)

Return:如果采集成功,返回TRUE,否则返回FALSE。

Note:
1、有些非常特殊的情况,即RecordCount1不等于RecordCount2,此时函数将返回
FALSE,但实际上已经采集到了数据,只是有可能丢失了一些记录。使用者可灼情处理它。
2、在SourceRecordSet.txt中每一行即是采集到的记录。其结构如下:1-2位是用十六进制表示的考勤机地址。(例:“128888880109061344AA”中,地址“&H12”即为十进制的18。)3-8位是考勤记录的逻辑卡号。(如上面的“888888”)9-14位表示打卡记录的日期,按年月日排列。(如上面的01/09/06)15-18位是打卡记录的时间。按小时分钟排列。(如上面的13:44)最两位应固定为AA,它表示一个记录的结束标志。

提示:每次调用采集函数,都将会从文件中清除掉前一次采集的数据。

Example:
Dim Address as integer
Dim RecordCount1 as integer,RecordCount2 as integer
Dim BooleanFlag as Boolean
BooleanFlag=Object.GatherData(address,RecordCount1,RecordCount2)


附录1-1动态库在VB中的引用

第一步:请将动态库考贝到你应用程序的目录下,(这样应该是有好处的)。

第二步:打开VB,在Project项中选取“引用”。然后选中KqConnect.dll,按确认。正常将如下图所示:再按确认即可。

第三步:此时可以声明一个类的变量,然后再创建实例即可以调用动态库的接口函数。

在delphi中怎麼調用?
 
看看delphi是怎么处理api函数的不就清楚了。
 
LibHandle:THandle;
TOpenCom=Function(com:integer):Integer;stdcall;
Procedure Open_com;
Var
OpenCom:TOpenCom;
Begin
LibHandle:=LoadLibrary('KQCONNECT.dll');
If LibHandle<=0 then
Raise Exception.Create('{LoadLibrary Faile] GetLastError reports:'+
Inttostr(GetLastError));
@OpenCom:=GetProcAddress(LibHandle,'OpenCom');
If OpenCom(ComNu)<>0 Then
Begin
Showmessage('¶Ë¿ÚÎÞ·¨´ò¿ª!');
Err_BJ;
end;
end;

对象可以建立也可以不建立。
其他函数也可以通过GetProcAddress(LibHandle,'OpenCom');调用
最后FreeLibrary(LibHandle);
 

Similar threads

S
回复
0
查看
962
SUNSTONE的Delphi笔记
S
S
回复
0
查看
784
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
974
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
顶部