怎样调用dephi的dll动态连接库,下面是dephi的dll的函数说明,小弟没弄过dll希望领导们给看看,举一下用vc++调用其中某个函数的例子,网上相关资料给的例子看不明白*_*,不然我就死悄悄了,谢谢大家了(从里面举个例子吧!)********************************************************
{*ICCODE 智能卡函数库 Delphi 声明单元*}unit ICCODE;interface
uses
Windows, SysUtils;const
SOK = 'OK';
SERROR = 'ERROR';
SOVER = 'OVER';
ICCODE_API = 'ICCODE20.dll';// 自定义通信错误常量
ERROR_IO_CHECK=$00000001; //校验错误
ERROR_IO_READ=$00000002; //读错误
ERROR_IO_WRITE=$00000003; //写错误
ERROR_IO_NOEND=$00000004; //串口接收未结束而中断
ERROR_IO_NOPEN=$00000005; //不能打开端口
ERROR_IO_COMMAND=$00000006; //命令错误
ERROR_IO_NOHANDLE=$00000007; //无句柄错误
ERROR_IO_TIMEOUT=$00000008; //通讯超时type
PClockInfo = ^TClockInfo;
TClockInfo = record
hPort: THandle;
clock_id: Byte;
Ver: string;
ICID: BOOL;
Fireware: Double;
RunMode: Integer;
Port, BaudRate, SelType, DeviceType, Clock_Type: integer;
Block, CmdVerify, Connected, bSelected: Boolean;
end;{设备联接类}// 打开端口及联接设备
function ConnectClock(Port, BaudRate: Integer; ClockNo: Byte; BroadCast: Boolean=False): THandle; stdcall; external ICCODE_API
// Port : 端口号, COM1=1, COM2=2;
// BaudRate : 波特率, 一般为9600
// ClockNo : 为机号, 范围0-252
// BroadCast : 为开始群发功能, 不接收返回状态
// 说明 : 返回值为端口句柄, 当返回-1时表示端口无效或是被占用, 返回0时代表无法联机// 断开联接及关闭端口
function DisConnectClock(hPort: THandle): Boolean; stdcall; external ICCODE_API
// 此函数和ConnectClock 对应// 检查指定的机器是否在联机状态
function CheckConnectClock(hPort: THandle; ClockNo: Byte; BroadCast: Boolean=False): Byte; stdcall; external ICCODE_API
// ClockNo : 为机号, 0-252
// BroadCast : 为开始群发功能, 不接收返回状态
// 说明 : 返回机器运行模式, 只能是下列值
// Return=0 联接不成功
// Return=1 考勤机, Return=2考勤门禁机, Return=3门禁机, Return=4份饭机// 联接指定的机器
function CallClock(hPort: THandle; ClockNo: Byte; BroadCast: Boolean=False): Byte; stdcall; external ICCODE_API
// ClockNo : 为机号, 0-252
// BroadCast : 为开始群发功能, 不接收返回状态
// 说明 : 返回机器运行模式, 只能是下列值
// Return=0 联接不成功
// Return=1 考勤机, Return=2考勤门禁机, Return=3门禁机, Return=4份饭机// 取消联接机器
function UnCallClock(hPort: THandle): Boolean; stdcall; external ICCODE_API
// 机器复位
function ResetClock(hPort: THandle): Boolean;stdcall; external ICCODE_API
// 将卡钟复位到出厂状态,复位会清除所有数据和下载名单// 读设备型号参数
function GetClockParam(hPort: THandle; var DeviceType: Integer; var Fireware: Double; var ICID: BOOL): Boolean; stdcall; external ICCODE_API
// 自动识别机器型号, 一般在联机后马上调用以使DLL识别型号// 手动设置型号参数
// 取得设备序列号
function ReadClockSerialNo(hPort: THandle; SerialNo: PChar): Boolean; stdcall; external ICCODE_API// 设置设备序列号
function SetClockSerialNo(hPort: THandle; SerialNo: PChar): Boolean; stdcall; external ICCODE_API{版本控制类}{设备管理普通类}
// 设置刷卡时显示卡号还是工号
function SetupDisplayNumberType(hPort: THandle; Kind: Integer): Boolean;stdcall; external ICCODE_API
// Kind : 显示类型
// Kind=0 : 显示卡号
// Kind=1 : 显示工号
// 实时读取一条刷卡数据(马上返回)
function RealReadRecord(hPort: THandle; Card: PChar; timeString: PChar; var , flag, clock_id: Integer): Integer;stdcall; external ICCODE_API
// Card : 读回的卡号字符串(0结束), 缓冲区需大於20字节长度
// timeString : 读回的14位刷卡时间字符串(0结束), 格式为yyyymmddhhmmss, 缓冲区需大於20字节长度
// : 打卡标识
// flag : 记录类型(保留)
// clock_id : 刷卡机号
// 说明当返回0时代表成功, 其它值参考自定义错误// 开始或结束读取刷卡区的卡号(非实时功能)
function ReadCardNo(hPort: THandle; Card: PChar; Kind: Integer): Boolean;stdcall; external ICCODE_API
// CardNo : 返回读取的卡号缓冲区, 不小于20字节
// Kind : 当Kind=0开始读取卡号, Kind=1 结束读取卡号// 实时读取在刷卡区的卡号(无等待马上返回)
function RealReadCardNo(hPort: THandle; Card: PChar; Card_Length: Integer=10): Boolean;stdcall; external ICCODE_API
// Card : 读回的卡号字符串(0结束), 缓冲区需大於20字节长度
// Card_Length: 希望返回的卡号长度, 必须是10
// 说明 : 必须先调用ReadCardNo{实时控制类}
// 设置通信结束字符
procedure SetEndChar(Ch: Char); stdcall; external ICCODE_API{以下为错误处理函数}
// 取得最后一次函数调用的错误代码编号
function GetRecentErrCode(): DWORD; stdcall; external ICCODE_APIimplementation
end.
********************************************************
{*ICCODE 智能卡函数库 Delphi 声明单元*}unit ICCODE;interface
uses
Windows, SysUtils;const
SOK = 'OK';
SERROR = 'ERROR';
SOVER = 'OVER';
ICCODE_API = 'ICCODE20.dll';// 自定义通信错误常量
ERROR_IO_CHECK=$00000001; //校验错误
ERROR_IO_READ=$00000002; //读错误
ERROR_IO_WRITE=$00000003; //写错误
ERROR_IO_NOEND=$00000004; //串口接收未结束而中断
ERROR_IO_NOPEN=$00000005; //不能打开端口
ERROR_IO_COMMAND=$00000006; //命令错误
ERROR_IO_NOHANDLE=$00000007; //无句柄错误
ERROR_IO_TIMEOUT=$00000008; //通讯超时type
PClockInfo = ^TClockInfo;
TClockInfo = record
hPort: THandle;
clock_id: Byte;
Ver: string;
ICID: BOOL;
Fireware: Double;
RunMode: Integer;
Port, BaudRate, SelType, DeviceType, Clock_Type: integer;
Block, CmdVerify, Connected, bSelected: Boolean;
end;{设备联接类}// 打开端口及联接设备
function ConnectClock(Port, BaudRate: Integer; ClockNo: Byte; BroadCast: Boolean=False): THandle; stdcall; external ICCODE_API
// Port : 端口号, COM1=1, COM2=2;
// BaudRate : 波特率, 一般为9600
// ClockNo : 为机号, 范围0-252
// BroadCast : 为开始群发功能, 不接收返回状态
// 说明 : 返回值为端口句柄, 当返回-1时表示端口无效或是被占用, 返回0时代表无法联机// 断开联接及关闭端口
function DisConnectClock(hPort: THandle): Boolean; stdcall; external ICCODE_API
// 此函数和ConnectClock 对应// 检查指定的机器是否在联机状态
function CheckConnectClock(hPort: THandle; ClockNo: Byte; BroadCast: Boolean=False): Byte; stdcall; external ICCODE_API
// ClockNo : 为机号, 0-252
// BroadCast : 为开始群发功能, 不接收返回状态
// 说明 : 返回机器运行模式, 只能是下列值
// Return=0 联接不成功
// Return=1 考勤机, Return=2考勤门禁机, Return=3门禁机, Return=4份饭机// 联接指定的机器
function CallClock(hPort: THandle; ClockNo: Byte; BroadCast: Boolean=False): Byte; stdcall; external ICCODE_API
// ClockNo : 为机号, 0-252
// BroadCast : 为开始群发功能, 不接收返回状态
// 说明 : 返回机器运行模式, 只能是下列值
// Return=0 联接不成功
// Return=1 考勤机, Return=2考勤门禁机, Return=3门禁机, Return=4份饭机// 取消联接机器
function UnCallClock(hPort: THandle): Boolean; stdcall; external ICCODE_API
// 机器复位
function ResetClock(hPort: THandle): Boolean;stdcall; external ICCODE_API
// 将卡钟复位到出厂状态,复位会清除所有数据和下载名单// 读设备型号参数
function GetClockParam(hPort: THandle; var DeviceType: Integer; var Fireware: Double; var ICID: BOOL): Boolean; stdcall; external ICCODE_API
// 自动识别机器型号, 一般在联机后马上调用以使DLL识别型号// 手动设置型号参数
// 取得设备序列号
function ReadClockSerialNo(hPort: THandle; SerialNo: PChar): Boolean; stdcall; external ICCODE_API// 设置设备序列号
function SetClockSerialNo(hPort: THandle; SerialNo: PChar): Boolean; stdcall; external ICCODE_API{版本控制类}{设备管理普通类}
// 设置刷卡时显示卡号还是工号
function SetupDisplayNumberType(hPort: THandle; Kind: Integer): Boolean;stdcall; external ICCODE_API
// Kind : 显示类型
// Kind=0 : 显示卡号
// Kind=1 : 显示工号
// 实时读取一条刷卡数据(马上返回)
function RealReadRecord(hPort: THandle; Card: PChar; timeString: PChar; var , flag, clock_id: Integer): Integer;stdcall; external ICCODE_API
// Card : 读回的卡号字符串(0结束), 缓冲区需大於20字节长度
// timeString : 读回的14位刷卡时间字符串(0结束), 格式为yyyymmddhhmmss, 缓冲区需大於20字节长度
// : 打卡标识
// flag : 记录类型(保留)
// clock_id : 刷卡机号
// 说明当返回0时代表成功, 其它值参考自定义错误// 开始或结束读取刷卡区的卡号(非实时功能)
function ReadCardNo(hPort: THandle; Card: PChar; Kind: Integer): Boolean;stdcall; external ICCODE_API
// CardNo : 返回读取的卡号缓冲区, 不小于20字节
// Kind : 当Kind=0开始读取卡号, Kind=1 结束读取卡号// 实时读取在刷卡区的卡号(无等待马上返回)
function RealReadCardNo(hPort: THandle; Card: PChar; Card_Length: Integer=10): Boolean;stdcall; external ICCODE_API
// Card : 读回的卡号字符串(0结束), 缓冲区需大於20字节长度
// Card_Length: 希望返回的卡号长度, 必须是10
// 说明 : 必须先调用ReadCardNo{实时控制类}
// 设置通信结束字符
procedure SetEndChar(Ch: Char); stdcall; external ICCODE_API{以下为错误处理函数}
// 取得最后一次函数调用的错误代码编号
function GetRecentErrCode(): DWORD; stdcall; external ICCODE_APIimplementation
end.
********************************************************
然后再到你上面的程序中看函数原型。
typedef HANDLE (__stdcall *FConnectClock)(int Port, int BaudRate,unsigned char ClockNo, bool BroadCast=false);
2.调用:
FConnectClock ConnectClock;
HINSTANCE hs= LoadLibrary("ICCODE20.dll");
ConnectClock=(FConnectClock) GetProcAddress(hs,"ConnectClock");
ConnectClock(1,9600,'1');
你最好问厂家要VC的.h及.lib,这样就简单了
const
///////////////////////////////////////
它下面的是常量定义.你可以译成#define ERROR_IO_CHECK 0x00000001
//////////////////////////////////////
type///////////////////////////////////////
它下面是结构体定义:你可以译成struct.
typedef struct _ClockInfo
{
hPort :handle;
clock_id:BYTE
.........
}ClockInfo,*PClockInfo
///////////////////////////////////////function ConnectClock(Port, BaudRate: Integer; ClockNo: Byte; BroadCast: Boolean=False): THandle; stdcall; external ICCODE_API
///这就是函数引用的声明.HANDLE __STDCALL ConnectClock(.......);
或HANDLE WINAPI ConnectClock(....);
象上面的这样引用你需要有lib文件
加上这句#progra comment(lib,"***.lib");如果没有lib文件就只有象[keiy]说明的这样动态加载DLL.