UHFReader18CSharp.DLL动态连接库使用手册V2.5

UHFReader18CSharp.DLL动态连接库使用手册V2.5
UHFReader18CSharp.DLL动态连接库使用手册V2.5

UHFReader18CSharp.DLL动态连接库

使用手册V2.5

1.操作系统: (1)

2.函数详单: (1)

2.1)通用函数: (1)

2.2)EPCC1-G2协议函数: (2)

2.3)18000-6B协议函数: (4)

3.函数的描述: (5)

3.1)通用函数: (5)

3.1.1) AutoOpenComPort():自动连接串口 (5)

3.1.2) OpenComPort():连接到指定串口 (6)

3.1.3) CloseComPort():关闭串口连接 (7)

3.1.4) CloseSpecComPort():关闭指定串口 (7)

3.1.5)GetReaderInformation():获得读写器的信息 (7)

3.1.6) WriteComAdr():写入读写器地址 (8)

3.1.7) WriteScanTime():设置询查命令最大响应时间 (9)

3.1.8) SetPowerDbm():设置读写器功率 (9)

3.1.9) Writedfre():设置读写器工作频率 (9)

3.1.10) Writebaud():设置串口波特率 (10)

3.1.11) SetWGParameter():设置韦根参数 (11)

3.1.12) SetWorkMode():设置工作模式 (11)

3.1.13) GetWorkModeParameter ():读取工作模式参数 (12)

3.1.14) ReadActiveModeData ():读取主动模式数据- (13)

3.1.15) SetAccuracy():EAS检测精度测试- (13)

3.1.16) SetOffsetTime ():设置Syris命令响应偏置时间- (13)

3.1.17) SetFhssMode ():设置读写器跳频模式 (14)

3.1.18) GetFhssMode ():获取读写器跳频模式- (14)

3.1.19) SetTriggerTime ():获取读写器跳频模式- (15)

3.1.20) BuzzerAndLEDControl ():声光控制命令- (15)

3.1.21) SetRelay ():设置继电器动作- (16)

3.1.22) OpenNetPort():连接网口 (16)

3.1.23) CloseNetPort():关闭网口 (17)

3.2)EPCC1-G2协议函数: (17)

3.2.1) Inventory_G2 ():G2询查命令 (17)

3.2.2) ReadCard_G2 ():G2读取数据命令 (18)

3.2.3) WriteCard_G2 ():G2写命令 (19)

3.2.4) EraseCard_G2 ():G2块擦除命令 (20)

3.2.5) SetCardProtect_G2 ():G2设定存储区读写保护状态命令 (21)

3.2.6) DestroyCard_G2 ():G2销毁卡片命令 (22)

3.2.7) WriteEPC_G2 ():G2写EPC号命令 (23)

3.2.8) SetReadProtect_G2 ():G2单张读保护设置命令 (23)

3.2.9) SetMultiReadProtect_G2 ():G2单张读保护设置命令(不需卡号) (24)

3.2.10) RemoveReadProtect_G2 ():G2解锁读保护命令 (25)

3.2.11) CheckReadProtected_G2 ():G2测试卡片是否被读保护命令 (25)

3.2.12) SetEASAlarm_G2 ():G2EAS报警设置命令 (26)

3.2.13) CheckEASAlarm_G2 ():G2EAS报警探测命令 (27)

3.2.14) LockUserBlock_G2 ():G2user区块锁命令(永久锁定) (27)

3.2.15) WriteBlock_G2 ():G2块写命令 (28)

3.3)18000-6B协议函数: (29)

3.3.1) Inventory_6B ():6B寻查命令(单张) (29)

3.3.2) Inventory2_6B ():6B按条件寻查电子标签命令 (30)

3.3.3) ReadCard_6B ():6B读数据命令 (30)

3.3.4) WriteCard_6B ():6B写数据命令 (31)

3.3.5) CheckLock_6B ():6B锁定检测命令 (32)

3.3.6) LockByte_6B ():6B锁定命令 (32)

4.其他返回值定义 (33)

5.错误代码定义 (34)

上位机应用程序通过UHFReader18CSharp.DLL操作EPCC1-G2、18000-6B格式电子标签读写器。

1.操作系统:

WINDOWS 2000/XP

2.函数详单:

UHFReader18CSharp.DLL包括了如下的操作函数:

2.1)通用函数:

1)Function int StaticClassReaderB.AutoOpenComPort(int* Port,unsigned char * ComAdr, unsigned char *Baud ,int* FrmHandle);

2)Function int StaticClassReaderB.OpenComPort(int Port, unsigned char *ComAdr, unsigned char *Baud,int* FrmHandle);

3)Function int StaticClassReaderB.CloseComPort(void);

4) Function int StaticClassReaderB.WINAPI CloseSpecComPort(int FrmHandle);

5)Function int StaticClassReaderB.GetReaderInformation(unsigned char *ComAdr, unsigned char *VersionInfo, unsigned char *ReaderType, unsigned char *TrType,unsigned char * dmaxfre , unsigned char *dminfre, unsigned char *powerdBm,unsigned char *ScanTime, int FrmHandle);

6) Function int StaticClassReaderB.WriteComAdr(unsigned char *ComAdr, unsigned char *ComAdrData, int FrmHandle);

7)Function int StaticClassReaderB.WriteScanTime(unsigned char *ComAdr, unsigned char *ScanTime, int FrmHandle);

8)Function int StaticClassReaderB.SetPowerDbm (unsigned char *ComAdr, unsigned char * powerDbm, int FrmHandle);

9)Function int StaticClassReaderB.Writedfre (unsigned char *ComAdr, unsigned char * dmaxfre, unsigned char * dminfre,int FrmHandle);

10)Function int StaticClassReaderB.Writebaud (unsigned char *ComAdr, unsigned char * baud, int FrmHandle);

11) Function int StaticClassReaderB.SetWGParameter(unsigned char *ComAdr, unsigned char Wg_mode,unsigned char Wg_Data_Inteval,unsigned char Wg_Pulse_Width, unsigned char Wg_Pulse_Inteval,int FrmHandle);

12)Function int StaticClassReaderB.SetWorkMode(unsigned char *ComAdr, unsigned char * Parameter, int FrmHandle);

13)Function int StaticClassReaderB.GetWorkModeParameter(unsigned char *ComAdr, unsigned char * Parameter, int FrmHandle);

14)Function int StaticClassReaderB.ReadActiveModeData(unsigned char *ActiveModeData, unsigned char * Datalength, int FrmHandle);

15) Function int StaticClassReaderB.SetAccuracy(unsigned char * ComAdr, unsigned char Accuracy , long FrmHandle);

16) Function int StaticClassReaderB.SetOffsetTime(unsigned char * ComAdr, unsigned char OffsetTime, long FrmHandle);

17) Function int StaticClassReaderB.SetFhssMode(unsigned char * ComAdr, unsigned char FhssMode, long FrmHandle);

18) Function int StaticClassReaderB.GetFhssMode(unsigned char * ComAdr, unsigned char *FhssMode, long FrmHandle);

19) Function int StaticClassReaderB.SetTriggerTime(unsigned char * ComAdr, unsigned char *TriggerTime, long FrmHandle);

20) Function int StaticClassReaderB.BuzzerAndLEDControl(unsigned char * ComAdr, unsigned char AvtiveTime, unsigned char SilentTime, unsigned char Times, int FrmHandle);

21) Function int StaticClassReaderB.SetRelay(unsigned char * ComAdr, unsigned char RelayStatue, long FrmHandle);

22) Function int StaticClassReaderB.OpenNetPort (int Port, LPSTR IPaddr, ,unsigned char *ComAdr, int FrmHandle);

23) Function int StaticClassReaderB.CloseNetPort (int FrmHandle);

2.2)EPCC1-G2 协议函数:

1)Function int StaticClassReaderB. Inventory_G2 (unsigned char *ComAdr, unsigned char AdrTID,unsigned char LenTID,unsigned char TIDFlag,unsigned char * EPClenandEPC, int * Totallen, int *CardNum,int FrmHandle);

2)Function int StaticClassReaderB. ReadCard_G2 (unsigned char *ComAdr, unsigned char * EPC, unsigned char * Mem, unsigned char * WordPtr, unsigned char * Num, unsigned char * Password , unsigned char maskadr, unsigned char maskLen, unsigned

char maskFlag,unsigned char * Data , unsigned char * EPClength, unsigned char * errorcode,int FrmHandle);

3)Function int StaticClassReaderB.WriteCard_G2 (unsigned char *ComAdr, unsigned char * EPC, unsigned char * Mem, unsigned char * WordPtr, unsigned char * Writedatalen, unsigned char *Writedata,unsigned char * Password, unsigned char maskadr, unsigned char maskLen, unsigned char maskFlag, int WrittenDataNum, unsigned char * EPClength, unsigned char * errorcode,int FrmHandle);

4)Function int StaticClassReaderB.EraseCard_G2 (unsigned char *ComAdr, unsigned char * EPC, unsigned char * Mem, unsigned char * WordPtr, unsigned char * Num, unsigned char * Password, unsigned char maskadr, unsigned char maskLen, unsigned char maskFlag, unsigned char * EPClength, unsigned char * errorcode,int FrmHandle);

5)Function int StaticClassReaderB.SetCardProtect_G2 (unsigned char *ComAdr, unsigned char * EPC, unsigned char * select, unsigned char * setprotect, unsigned char * Password, unsigned char maskadr, unsigned char maskLen, unsigned char maskFlag, unsigned char * EPClength, unsigned char * errorcode,int FrmHandle);

6)Function int StaticClassReaderB.DestroyCard_G2 (unsigned char *ComAdr, unsigned char * EPC, unsigned char * Password, unsigned char maskadr, unsigned char maskLen, unsigned char maskFlag, unsigned char * EPClength, unsigned char * errorcode,int FrmHandle);

7)Function int StaticClassReaderB. WriteEPC_G2 (unsigned char *ComAdr, unsigned char * Password, unsigned char * WriteEPC, unsigned char * WriteEPClen, unsigned char * errorcode,int FrmHandle);

8)Function int StaticClassReaderB.SetReadProtect_G2(unsigned char *ComAdr, unsigned char * EPC, unsigned char * Password, unsigned char maskadr, unsigned char maskLen, unsigned char maskFlag, unsigned char * EPClength, unsigned char * errorcode,int FrmHandle);

9)Function int StaticClassReaderB.SetMultiReadProtect_G2 (unsigned char *ComAdr, unsigned char * Password, unsigned char * errorcode,int FrmHandle);

10)Function int StaticClassReaderB.RemoveReadProtect_G2(unsigned char * ComAdr , unsigned char * Password, unsigned char * errorcode,int FrmHandle);

11)Function int StaticClassReaderB.CheckReadProtected_G2(unsigned char * ComAdr, unsigned char *readpro,unsigned char * errorcode,int FrmHandle);

12)Function int StaticClassReaderB.SetEASAlarm_G2(unsigned char *ComAdr, unsigned char * EPC, unsigned char * Password, unsigned char maskadr, unsigned char maskLen, unsigned char maskFlag,unsigned char * EAS, unsigned char * EPClength, unsigned char * errorcode,int FrmHandle);

13)Function int StaticClassReaderB.CheckEASAlarm_G2(unsigned char *ComAdr, unsigned char * errorcode,int FrmHandle);

14)Function int StaticClassReaderB.LockUserBlock_G2(unsigned char *ComAdr, unsigned char * EPC, unsigned char * Password, unsigned char maskadr, unsigned char maskLen, unsigned char maskFlag, unsigned char * BlockNum,unsigned char * EPClength, unsigned char * errorcode,int FrmHandle);

15)Function int StaticClassReaderB. WriteBlock_G2 (unsigned char *ComAdr, unsigned char * EPC, unsigned char * Mem, unsigned char * WordPtr, unsigned char * Writedatalen, unsigned char *Writedata,unsigned char * Password, unsigned char maskadr, unsigned char maskLen, unsigned char maskFlag, int WrittenDataNum, unsigned char * EPClength, unsigned char * errorcode,int FrmHandle);

2.3)18000-6B 协议函数:

1)Function int StaticClassReaderB.Inventory_6B(unsigned char *ComAdr, unsigned char * ID_6B ,int FrmHandle);

2)Function int StaticClassReaderB.Inventory2_6B(unsigned char *ComAdr, unsigned char * Condition , unsigned char * StartAddress, unsigned char * mask , unsigned char * ConditionContent,unsigned char * ID_6B , int * Cardnum,int FrmHandle);

3)Function int StaticClassReaderB. ReadCard_6B(unsigned char *ComAdr, unsigned char * ID_6B , unsigned char * StartAddress, unsigned char * Num, unsigned char * Data, unsigned char * errorcode, int FrmHandle);

4)Function int StaticClassReaderB.WriteCard_6B (unsigned char *ComAdr, unsigned char * ID_6B , unsigned char * StartAddress, unsigned char * Writedata, unsigned char * Writedatalen, unsigned char * writtenbyte, unsigned char * errorcode, int FrmHandle);

5)Function int StaticClassReaderB.LockByte _6B (unsigned char *ComAdr, unsigned char * ID_6B , unsigned char * Address, unsigned char * errorcode, int FrmHandle);

6)Function int StaticClassReaderB. CheckLock_6B(unsigned char *ComAdr, unsigned char * ID_6B , unsigned char * Address, unsigned char * ReLockState,unsigned char * errorcode, int FrmHandle);

3.函数的描述:

3.1)通用函数:

3.1.1) AutoOpenComPort():自动连接串口

功能描述:

该函数用于自动识别与读写器连接的串口并且执行初始化操作,然后通过连接串口和读写器以创建通信连接。数据传输协议是57600 bps,8位数据,1停止位,没有奇偶校验位。

在调用其它函数之前,您必须先连接串口和读写器。

应用:

Function int StaticClassReaderB.AutoOpenComPort(int* Port, unsigned char *ComAdr, unsigned char * Baud ,int* FrmHandle);

参数:

Port:输出变量,COM1—COM12与读写器连接的串口号。

ComAdr:输入/输出变量,远距离读写器的地址。以广播地址(0xFF)调用此函数,函数将检测各个端口,并将检测到的连接有读写器的端口以及该端口上读写器的实际地址回写到指针Port和ComAdr所指变量中;以其它地址调用此函数,将在各个端口检测是否连接了具有指定ComAdr地址的读写器,并将检测到的端口号回写到指针Port所指变量中。

通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1.

COM1-COM12的含义如下:

#define COM1 1

#define COM2 2

#define COM3 3

#define COM4 4

#define COM5 5

#define COM6 6

#define COM7 7

#define COM8 8

#define COM9 9

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义。

3.1.2) OpenComPort():连接到指定串口

功能描述:

该函数用于指定串口初始化,并通过连接串口和读写器以创建通信连接。数据传输协议是57600bps,8位数据,1位停止位,没有奇偶校验位。

在调用其它函数之前,您必须先连接串口和读写器。

应用:

Function int StaticClassReaderB.OpenComPort(int Port, unsigned char *ComAdr, unsigned char * Baud,int FrmHandle);

参数:

Port:输入变量,COM1—COM12常数。

ComAdr:输入/输出变量,远距离读写器的地址。以广播地址(0xFF)调用此函数,函数将检测指定端口,并将检测到的连接在此端口上的读写器的实际地址回写到指针ComAdr所指变量中;以其它地址调用此函数,将检测指定端口上是否连接了具有指定ComAdr地址的读写器。

通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1.

COM1-COM12的定义如下:

#define COM1 1

#define COM2 2

#define COM3 3

#define COM4 4

#define COM5 5

#define COM6 6

#define COM7 7

#define COM8 8

#define COM9 9

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义。

3.1.3) CloseComPort():关闭串口连接

功能描述:

该函数用于撤销串口和读写器的连接并释放相应资源。在一些开发环境里,串口资源必须在离开该程序前被释放,否则可能会造成系统不稳定。

应用:

Function int StaticClassReaderB.CloseComPort(void);

参数:无

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义。

3.1.4) CloseSpecComPort():关闭指定串口

功能描述:

该函数用于关闭指定串口。

应用:

Function int StaticClassReaderB.CloseSpecComPort(int FrmHandle);

参数:

FrmHandle:输入变量,COM1—COM12常数。

COM1-COM12的定义如下:

#define COM1 1

#define COM2 2

#define COM3 3

#define COM4 4

#define COM5 5

#define COM6 6

#define COM7 7

#define COM8 8

#define COM9 9

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义。

3.1.5)GetReaderInformation():获得读写器的信息

功能描述:

执行该命令后,将获得读写器的信息,这其中包括读写器地址(ComAdr)和读写器软件版本(VersionInfo)的信息等多项信息。

应用:

Function int StaticClassReaderB.GetReaderInformation(unsigned char *ComAdr, unsigned char *VersionInfo, unsigned char *ReaderType, unsigned char *TrType,unsigned char * dmaxfre , unsigned char *dminfre, unsigned char *powerdBm,unsigned char *ScanTime, int FrmHandle);

参数:

ComAdr:输入/输出变量,远距离读写器的地址。以广播地址(0xFF)

调用此函数,ComAdr将返回读写器的实际地址,以其它地址调用此函数,将由ComAdr地址指定的读写器执行此函数命令。

VersionInfo:指向输出数组变量(输出的是每字节都转化为字符的数据),远距离读写器版本信息,长度2个字节。第1个字节为版本号,第2个字节为子版本号。

ReaderType:输出变量,读写器类型代码,0x61代表UHFReader18。

TrType:指向输出数组变量(输出的是每字节都转化为字符的数据),读写器协议支持信息,长度2个字节,具体定义请参见用户手册。(bit1为1表示支持18000-6c协议,其它位保留。Bit0为1表示18000-6B协议。) Dmaxfre:输出变量,当前读写器使用的最高频率。

Dminfre:输出变量,当前读写器使用的最低频率。实际频率计算公式为:Fs = 902.6 + N x 0.4 (MHz) 其中N∈[0, 62]。N代表dmaxfre或dminfre。

PowerdBm: 输出变量,读写器的输出功率。范围是0到18,当PowerdBm 为0x00时,表示读写器的输出功率未知。

ScanTime:输出变量,读写器询查命令最大响应时间。

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1.

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义。

3.1.6) WriteComAdr():写入读写器地址

功能描述:

执行该命令后,读写器将会把读写器地址改为用户给定的值,并把这个值写入EEPROM保存。出厂时默认值是0x00。允许用户的修改范围是0x00~0xfe。

当用户写入的值是0xff时,读写器将会自动恢复成默认值0x00。

应用:

Function int StaticClassReaderB.WriteComAdr(unsigned char *ComAdr, unsigned char *ComAdrData, int FrmHandle);

参数:

ComAdr : 输入变量,原先的读写器地址

ComAdrData:输入变量,一个字节,待写入的读写器地址

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1.

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义。

3.1.7) WriteScanTime():设置询查命令最大响应时间

功能描述:

询查命令的最大响应时间范围是3~255*100ms,默认值为30*100ms。

应用:

Function int StaticClassReaderB.WriteScanTime(unsigned char *ComAdr, unsigned char *ScanTime, int FrmHandle);

参数:

ComAdr : 输入变量,读写器地址

ScanTime:输入变量,一个字节,询查命令响应时间

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1.

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义。

3.1.8) SetPowerDbm():设置读写器功率

功能描述:

本命令用来设置读写器功率。

应用:

Function int StaticClassReaderB. SetPowerDbm (unsigned char *ComAdr, unsigned char * powerDbm, int FrmHandle);

参数:

ComAdr : 输入变量,读写器地址

Powerdbm:输入变量,一个字节。读写器的输出功率。取值范围是0~18。

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1.

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义。

3.1.9) Writedfre():设置读写器工作频率

功能描述:

此命令设置读写器工作地上限频率,下限频率。上限频率必须大于或等于下限频率。

应用:

Function int StaticClassReaderB.Writedfre (unsigned char *ComAdr, unsigned char * dmaxfre, unsigned char * dminfre,int FrmHandle);

参数:

ComAdr: 输入变量,读写器地址

dmaxfre: 输入变量,一个字节。读写器工作的最大频率。取值范围是0~62。

dminfre: 输入变量,一个字节。读写器工作的最小频率。取值范围是0~62MinFre必须小于等于MaxFre。

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1。

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义。

3.1.10) Writebaud():设置串口波特率

功能描述:

此命令用来更改读写器的串口波特率。

应用:

Function int StaticClassReaderB.Writebaud (unsigned char *ComAdr, unsigned char * baud, int FrmHandle);

参数:

ComAdr: 输入变量,读写器地址

baud: 输入变量,一个字节。读写器上电后,波特率默认为57600。Baud

43000,但在DLL中的ApdComPort控件不支持波特率43000。

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1。

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义。

3.1.11) SetWGParameter():设置韦根参数

功能描述:

此命令用来设置韦根参数。

应用:

Function int StaticClassReaderB.SetWGParameter(unsigned char *ComAdr, unsigned char Wg_mode,unsigned char Wg_Data_Inteval,unsigned char Wg_Pulse_Width, unsigned char Wg_Pulse_Inteval,int FrmHandle);

参数:

ComAdr: 输入变量,读写器地址

Wg_mode: 输入变量,一个字节。

Bit0:韦根26,34选择位。Bit0=0时,选择韦根26,Bit0=1时选择韦根34.

Bit1:Bit1=0时韦根输出高字节在前,Bit1=1时,韦根输出低字节在前。其他位保留,默认为0.

Wg_Data_Inteval:输出数据间隔时间(0~255)*100ms,默认为30.

Wg_Pulse_Width:数据脉冲宽度(1~255)*100us,默认值为10.

Wg_Pulse_Inteval:数据脉冲间隔(1~ 55)*100us,默认值为15.

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1。

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义。

3.1.12) SetWorkMode():设置工作模式

功能描述:

此命令用来设置工作模式参数。

应用:

Function int StaticClassReaderB.SetWorkMode(unsigned char *ComAdr, unsigned char * Parameter, int FrmHandle);

参数:

ComAdr: 输入变量,读写器地址

Parameter: 指向输入数组变量,6个字节。从第一个字节至第六个分别为:

Read_Mode: 工作模式选择,Bit1Bit0=0:应答模式;Bit1Bit0=1:主动模式;

Bit1Bit0=2:触发模式(低电平有效);Bit1Bit0=3:触发模式(高电平有效)。

其它位保留,默认为0。只有时Bit1Bit0不等于0时以下参数才有效。

Mode_State: Bit0:协议选择位。Bit0=0时读写器支持18000-6C协议;

Bit0=1时,读写器支持18000-6B。Bit1:输出方式选择位。Bit1=0时韦根输出,Bit1=1时RS232/RS485输出。

Mem_Inven:当读写器工作在18000-6C协议时才有效,选择要读取的存储区或询查标签。0x00:保留区;0x01:EPC存储器;0x02:TID存储器;

0x03:用户存储器;0x04:多张查询;0x05:单张查询;0x06 :EAS检测。

其他值保留,若命令中出现了其它值,将返回参数出错的消息。

First_Adr:指定要读取的起始地址。18000-6C协议中:0x00 表示从第

一个字(第一个16位存储区)开始读,0x01表示从第2个字开始读,依次类推;18000-6B中:0x00 表示从第一个字节开始读,0x01表示从第2个字节开始读,依次类推。

Word_Num:要读取的字的个数,RS232输出方式下才有效。不能设置为0x00,否则将返回参数错误信息。Word_Num不能超过32,若Word_Num 设置为0或者超过了32,将返回参数出错的消息。

Tag_Time:主动模式下单张标签操作(读保留区、EPC区、TID区、用户区,单张查询)间隔时间(0~255)*1s,对同一张标签在间隔时间内只操作一次。默认值为零,即对标签操作不用等待时间。

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1。

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义。

3.1.13) GetWorkModeParameter ():读取工作模式参数

功能描述:

此命令用来读取工作模式参数。

应用:

Function int StaticClassReaderB.GetWorkModeParameter(unsigned char* ComAdr, unsigned char * Parameter, int FrmHandle);

参数:

ComAdr: 输入变量,读写器地址

Parameter: 指向输出数组变量,11个字节。从第一个字节至第十一个分别为:Wg_mode,Wg_Data_Inteval,Wg_Pulse_Width,Wg_Pulse_Inteval,Read_mode,Mode_state,Mem_Inven,First_Adr,Word_Num,Tag_Time,Accuracy。

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1。

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义

3.1.14) ReadActiveModeData ():读取主动模式数据-

功能描述:

此命令用来读取主动模式下读写器发送数据。

应用:

Function int StaticClassReaderB.ReadActiveModeData(unsigned char* ActiveModeData, unsigned char * Datalength, int FrmHandle);

参数:

ActiveModeData: 指向输出数组变量,读取主动模式下读写器发送数据,大小为Datalength个字节。

Datalength:输出变量,ActiveModeData的字节大小。

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1。

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义

3.1.15) SetAccuracy():EAS检测精度测试-

功能描述:

该命令用于设置主动模式下EAS检测精度。

应用:

Function int StaticClassReaderB.SetAccuracy(unsigned char * ComAdr, unsigned char Accuracy , long FrmHandle);

参数:

ComAdr: 输入变量,读写器地址.

Accuracy:输入变量,范围为0~8,数值越大精度越高。默认值为8。

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1。

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义

3.1.16) SetOffsetTime ():设置Syris命令响应偏置时间-

功能描述:

该命令用于设置Syris485模式下的Syris命令响应偏置时间。

应用:

Function int StaticClassReaderB.SetOffsetTime(unsigned char * ComAdr, unsigned char OffsetTime, long FrmHandle);

参数:

ComAdr: 输入变量,读写器地址.

OffsetTime:输入变量,Syris485命令响应偏置时间(0~100)*1ms,默

认值为0。

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1。

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义

3.1.17) SetFhssMode ():设置读写器跳频模式

功能描述:

该命令用于设置读写器的跳频模式。

应用:

Function int StaticClassReaderB.SetFhssMode(unsigned char * ComAdr, unsigned char FhssMode, long FrmHandle);

参数:

ComAdr: 输入变量,读写器地址.

FhssMode:输入变量,Bit0=0时为随机跳频模式,Bit=1时为自适应跳

频模式,默认值为0。Bit1~Bit7:保留,默认值为0。

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序

通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回

的句柄值为-1。

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义

3.1.18) GetFhssMode ():获取读写器跳频模式-

功能描述:

该命令用于获取读写器的跳频模式。

应用:

Function int StaticClassReaderB.GetFhssMode (unsigned char * ComAdr, unsigned char *FhssMode, long FrmHandle);

参数:

ComAdr: 输入变量,读写器地址.

FhssMode:输出变量,Bit0=0时为随机跳频模式,Bit0=1时为自适应

跳频模式。

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序

通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回

的句柄值为-1。

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义

3.1.19) SetTriggerTime ():获取读写器跳频模式-

功能描述:

该命令用于设置触发模式下触发有效时间。

应用:

Function int StaticClassReaderB.SetTriggerTime(unsigned char * ComAdr, unsigned char * TriggerTime, long FrmHandle);

参数:

ComAdr: 输入变量,读写器地址.

TriggerTime:输入/输出变量,触发有效时间(0~254)*1s,默认值为0,

当设置成255时,为获取当前触发有效时间。

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序

通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回

的句柄值为-1。

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义3.1.20) BuzzerAndLEDControl ():声光控制命令-

功能描述:

该命令用来控制LED灯和蜂鸣器按一定规律闪烁和鸣叫。

应用:

Function int StaticClassReaderB.BuzzerAndLEDControl(unsigned char * ComAdr, unsigned char AvtiveTime, unsigned char SilentTime, unsigned char Times, int FrmHandle);

参数:

ComAdr: 输入变量,读写器地址.

AvtiveTime:输入变量,LED灯亮和蜂鸣器鸣叫时间(ActiveT*50ms),

默认值为零。0<=ActiveT<=255,当设置成255时,为获取当前触发有

效时间。

SilentTime: 输入变量,LED灯和蜂鸣器静默时间(SilentT *50ms),默认值

为零。0<= SilentT <=255。

Times: 输入变量,LED灯亮和蜂鸣器鸣叫次数(0<=Times<=255) 默认值

为零.

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序

通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回

的句柄值为-1。

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义

3.1.21) SetRelay ():设置继电器动作-

功能描述:

该命令用于设置继电器。

应用:

Function int StaticClassReaderB. SetRelay (unsigned char * ComAdr, unsigned char RelayStatue,int FrmHandle);

参数:

ComAdr: 输入变量,读写器地址.

RelayStatue:输入变量,bit0和bit1有效,每一位对应一个继电器,为

1时继电器吸合,为0时继电器释放。

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序

通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回

的句柄值为-1。

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义3.1.22) OpenNetPort():连接网口

功能描述:

该函数用于打开与读写器连接的网口,然后通过连接网口和读写器以创建通信连接。

在调用其它函数之前,您必须先连接网口和读写器。

应用:

Function int StaticClassReaderB.OpenNetPort(long Port , LPTSTR IPaddr, unsigned char *ComAdr,int * FrmHandle);

参数:

Port:输入变量,范围在1024到65535间,读写器的TCP端口号。

IPaddr:输入变量,读写器的TCP的IP地址。

ComAdr:输入/输出变量,远距离读写器的地址。以广播地址(0xFF)调用此函数,函数将检测端口,并将检测到的连接有读写器的读写器地址返回到ComAdr所指变量中;以其它地址调用此函数,将在TCP端口检测是否连接了具有指定ComAdr地址的读写器。

FrmHandle:输出变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1.

返回:

如果该函数调用成功,返回一个零值。

否则,返回非零值请查看其他返回值定义,返回的错误代码请查看错误代码定义。

3.1.23) CloseNetPort():关闭网口

功能描述:

该函数用于撤销网口和读写器的连接并释放相应资源。在一些开发环境里,网口资源必须在离开该程序前被释放,否则可能会造成系统不稳定。

应用:

Function int StaticClassReaderB.CloseNetPort(long FrmHandle);

参数:

FrmHandle:输入变量,与读写器连接网口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器.

3.2) EPCC1-G2 协议函数:

3.2.1) Inventory_G2 ():G2询查命令

功能描述:

询查命令的作用是检查有效范围内是否有符合协议的电子标签存在。

应用:

Function int StaticClassReaderB.Inventory_G2(unsigned char *ComAdr, unsigned char AdrTID,unsigned char LenTID,unsigned char TIDFlag,unsigned char *EPClenandEPC, int *Totallen, int *CardNum,int FrmHandle);

参数:

ComAdr:输入变量,读写器地址。

AdrTID:输入变量,询查TID的起始地址。

LenTID:输入变量,询查TID的字数。

TIDFlag:输入变量,询查TID的标志。

TIDFlag=1:询查TID。

TIDFlag=0:询查EPC。

EPClenandEPC:指向输出数组变量(输出的是每字节都转化为字符的数据)。是读到的电子标签的EPC数据,是一张标签的EPC长度+一张标签的EPC号,依此累加。每个电子标签EPC号高字在前,每一个字的最高位在前。

Totallen:输出变量,EPClenandEPC的字节数。

CardNum:输出变量,电子标签的张数。

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1。

返回:

如果该函数调用成功,返回值:

0x01 询查时间结束前返回

0x02 询查时间结束使得询查退出

0x03 如果读到的标签数量无法在一条消息内传送完,将分多次发送。

0x04 还有电子标签未读取,电子标签数量太多,MCU存储不了

返回其他值,请查看其他返回值定义,返回的错误代码请查看错误代码定义。

3.2.2) ReadCard_G2 ():G2读取数据命令

功能描述:

这个命令读取标签的整个或部分保留区、EPC存储器、TID存储器或用户存储器中的数据。从指定的地址开始读,以字为单位。

应用:

Function int StaticClassReaderB.ReadCard_G2 (unsigned char *ComAdr, unsigned char * EPC, unsigned char * Mem, unsigned char * WordPtr, unsigned char * Num, unsigned char * Password , unsigned char maskadr, unsigned char maskLen, unsigned char maskFlag, unsigned char * Data , unsigned char * EPClength, unsigned char * errorcode,int FrmHandle);

参数:

ComAdr:输入变量,读写器地址。

EPC:指向输入数组变量(输入的是每字节都转化为字符的数据)。是电子标签的EPC号

Mem:输入变量,一个字节。选择要读取的存储区。

0x00: 保留区;

0x01:EPC存储器;

0x02:TID存储器;

0x03:用户存储器。

其他值保留。若命令中出现了其它值,将返回参数出错的消息。

WordPtr:输入变量,一个字节。指定要读取的字起始地址。0x00 表示从第一个字(第一个16位存储体)开始读,0x01表示从第2个字开始读,依次类推。

Num:输入变量,一个字节。要读取的字的个数。不能设置为0x00,将返回参数错误信息。Num不能超过120,即最多读取120个字。若Num 设置为0或者超过了120,将返回参数出错的消息。

Password:指向输入数组变量(输入的是每字节都转化为字符的数据),四个字节,这四个字节是访问密码。32位的访问密码的最高位在PassWord 的第一字节(从左往右)的最高位,访问密码最低位在PassWord第四字节的最低位,PassWord的前两个字节放置访问密码的高字。

maskadr:输入变量,EPC掩模起始字节地址。

maskLen:输入变量,掩模字节数。

maskFlag:输入变量,掩模使能标记。

maskFlag =1:掩模使能;

maskFlag =0:掩模禁止;

Data:指向输出数组变量(输出的是每字节都转化为字符的数据),是从标签中读取的数据。

EPClength:输入变量,一个字节。EPC号的字节长度。

Errorcode:输出变量,一个字节,读写器返回响应状态为0xFC时,返回错误代码。

FrmHandle:输入变量,返回与读写器连接端口对应的句柄,应用程序通过该句柄可以操作连接在相应端口的读写器。如果打开不成功,返回的句柄值为-1。

返回:

如果该函数调用成功,返回一个零值,读到的数据在Data中。

人事招聘操作手册(草稿)

生命人寿保险有限公司华强北营销创新项目财富管理中心人事招聘操作手册 (讨论稿) 生命人寿保险有限公司营销管理中心营销创新部 2010年8月

目录 一财富管理中心人事招聘目的 二财富管理中心人事招聘制度适用范围三人力资源经理的权责 四人事招聘的作业内容 五招聘的人员标准 六财富管理中心人事招聘流程图 七相关面试工具与表单

一、财富管理中心人事招聘目的 为招聘优秀、适用之人才,提升员工的整体素质,以适应财富管理中心整体发展与运作的需求,并使公司人员招聘程序有所依循。 二、财富管理中心人事招聘制度适用范围 (一)财富管理中心后援员工,分别为人力资源经理、客户资源经理、训练企划经理三个岗位。 (二)财富管理中心前线员工,分别为标准管理区总监、部门经理、理财经理、理财顾问四个岗位 三、人力资源经理的权责 (一)架构范围内招聘:根据财富管理中心业务发展计划及总公司人力资源部审批的招聘计划进行招聘工作。 (二)架构范围外招聘人才储备:人力资源经理要考虑某岗位人员突然离职等因素造成的架构人力补充问题,要进行一定量的人才储备,一旦出现需增补情况,人力资源经理要能及时的人才补充。 (三)人力资源经理对外进行人事招聘活动,必须受人力资源部委托,并由公司开具介绍信或证明文件。 四、人事招聘的作业内容 (一)人员增补的送审 1.因业务需要扩大编制或职务空缺填补等原因,可依公司核准的组织架构、人员编制,按照工作说明书的要求增补或填补人员。 2.由用财富管理中心营销管理分区填写《人力需求表》(附件1),并经权责主管核准,上报财富管理中心相关职能部门与领导,并会知财富管理中心综合部审核。 3. 财富管理中心综合部审核后,由人事专员根据人才规格办理人员内调或对外招聘作业。 (二)人员招聘途径

VB调用动态链接库(DLL)

VB调用动态链接库(DLL) 作为一种简单易用的Windows开发环境,Visual Basic 从一推出就受到了广大编程人员的欢迎。它使程序员不必再直接面对纷繁复杂的Windows消息,而可以将精力主要集中在程序功能的实现上,大大提高了编程效率。但凡事有利必有弊。 VB中高度的封装和模块化减轻了编程者的负担,同时也使开发人员失去了许多访问低层API函数和直接与Windows 交互的机会。因此,相比而言,VB应用程序的执行效率和功能比C/C++或Delphi生成的程序要差。为了解决这个问题,在一个大型的VB开发应用中,直接调用Windows API函数几乎是不可避免的;同时,还有可能需要程序员自己用 C/C++等开发一些动态连接库,用于在VB中调用。本文主要讨论在32位开发环境Visual Basic 5.0中直接调用Windows 95 API函数或用户生成的32位动态连接库的方法与规则。 Windows动态连接库是包含数据和函数的模块,可以被其它可执行文件(EXE、DLL、OCX 等)调用。动态连接库包含两种函数:输出(exported)函数和内部(internal)函数。输出函数可以被其它模块调用,而内部函数则只能在动态连接库内部使用。尽管动态连接库也能输出数据,但

实际上它的数据通常是只在内部使用的。使用动态连接库的优点是显而易见的。将应用程序的一部分功能提取出来做成动态连接库,不但减小了主应用程序的大小,提高了程序运行效率,还使它更加易于升级。多个应用程序共享一个动态连接库还能有效地节省系统资源。正因为如此,在Windows系统中,动态连接库得到了大量的使用。 一般来说,动态连接库都是以DLL为扩展名的文件,如Kernel32.dll、commdlg.dll等。但也有例外,如16位Windows 的核心部件之一GDI.exe其实也是一个动态库。编写动态连接库的工具很多,如VisualC++、BorlandC++、Delphi等,具体方法可以参见相关文档。下面只以Visual C++5.0为例,介绍一下开发应用于VisualBasic5.0的动态连接库时应注意的问题(本文中所有涉及C/C++语言或编译环境的地方,都以VC5为例;所有涉及VisualBasic的地方都以VB5 为例)。 作为一种32位Windows应用程序的开发工具,VB5生成的exe文件自然也都是32位的,通常情况下也只能调用32位的动态连接库。但是,并不是所有的32位动态库都能被VB生成的exe 文件正确地识别。一般来说,自己编写用于VB应用程序调用的动态连接库时,应注意以下几个方面的问题: 1、生成动态库时要使用__stdcall调用约定,而不能使用缺省的__cdecl调用约定;__stdcall 约定通常用于32位API

C C++动态链接库的创建与调用

C/C++中动态链接库的创建和调用 1.动态链接库的创建步骤: 创建Non-MFC DLL动态链接库 1.打开File —> New —> Project选项,选择Win32 Dynamic-Link Library —>sample project —>工程名:DllDemo 2.新建一个.h文件DllDemo.h 并添加如下代码: #ifdef DllDemo_EXPORTS #define DllAPI _declspec(dllexport) #else #define DllAPI _declspec(dllimport) extern “C” // 原样编译 { DllAPI int _stdcall Max(int a,int b); //_stdcall使非C/C++语言内能够调用API } #endif 3.新建一个.cpp文件,并添加如下代码 #include "DllDemo.h" DllAPI int __stdcall Max(int a,int b) { if(a==b) return NULL; else if(a>b) return a; else return b; } 4.编译程序生成动态链接库 1.2 用.def文件创建动态连接库DllDemo.dll 1、删除DllDemo工程中的DllDemo.h文件。 2、在DllDemo.cpp文件头,删除#include DllDemo.h语句。 3、向该工程中加入一个文本文件,命名为DllDemo.def并写入如下语句: LIBRARY MyDll EXPORTS Max@1 4、编译程序生成动态连接库。 2.动态链接库的调用步骤 2.1 隐式调用 1.建立DllCnsTest工程 2.将文件DllDemo.dll、DllDemo.lib拷贝到DllCnsTest工程所在的目录 3.在DllCnsTest中添加如下语句: #define DllAPI _declspec(dllimport) #pragma comment(lib,”DllDemo.lib”) extern “C” { DllAPI int _stdcall Max(int a,int b);

Android创建和使用数据库详细指南

Android创建和使用数据库详细指南(1) 摘要:每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库--SQLite,本文介绍的就是如何为你的Android应用程序创建和操作SQLite数据库。 数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据,那么就需要一个数据库系统存储你的结构化数据,Android使用SQLite数据库,它是一个开源的、支持多操作系统的SQL数据库,在许多领域广泛使用,如Mozilla FireFox就是使用SQLite 来存储配置数据的,iPhone也是使用SQLite来存储数据的。 在Android中,你为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于Android设备/data/data//databases文件夹中,在这篇文章中,你将会学习到如何在Android中创建和使用数据库。 1SQLite数据库 使用Eclipse创建一个Android项目,取名为Database,如图1所示: 图1 数据库-使用Eclipse创建你的Android新项目

2创建DBAdapter辅助类 接下来创建一个数据库,取名为bookstitles,字段如图2所示。 图2 数据库字段在DBAdapter.java文件中,定义清单1中的常量。 清单1 定义DBAdapter.java文件中的常量 package net.learn2develop.Database; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper;

VC++动态链接库创建和调用全过程详解

1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 对动态链接库,我们还需建立如下概念: (1)DLL 的编制与具体的编程语言及编译器无关 只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。 (2)动态链接库随处可见 我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。 一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。 (3)VC动态链接库的分类 Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。 非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。 由于本文篇幅较长,内容较多,势必需要先对阅读本文的有关事项进行说明,下面以问答形式给出。 问:本文主要讲解什么内容? 答:本文详细介绍了DLL编程的方方面面,努力学完本文应可以对DLL有较全面的掌握,并能编写大多数DLL程序。 问:如何看本文? 答:本文每一个主题的讲解都附带了源代码例程,可以随文下载(每个工程都经WINRAR压缩)。所有这些例程都由笔者编写并在VC++6.0中调试通过。

创建数据库和表

数学与信息技术学院实验报告 实验课程名称:SQL语言基础实验 实验项目名称:实验二创建数据库和表 专业班级: 学号: 姓名: 指导教师:

实验一创建数据库和表 【实验目的】 (1)了解MySQL数据库的存储引擎的分类; (2)了解表的结构特点; (3)了解MySQL的基本数据类型; (4)了解空值概念; (5)学会使用SQL界面工具中创建数据库和表; (6)学会使用SQL语句创建数据库和表。 【实验容及步骤】 一,实验容 实验题目 创建用于企业管理的员工管理数据库,数据库名为YGGL,包含员工的信息、部门信息及员工的薪水信息。数据库YGGL包含下列3个表: (1)Employees:员工信息表: (2)Departments:部门信息表: (3)Salary:员工薪水情况表。 二,实验步骤 1,使用命令行为方式创建数据库YGGL

打开MySQL Command Line Client,输入管理员密码登录,使用CREATE语句创建YGGL数据库: Creat database YGGL; 2,使用SQL语句在YGGL数据库中创建表Employees 执行创建表employees的SQL语句: 用同样的方法在数据库YGGL中创建表Salary。 创建一个结构与employees表结构相同的空表Employees(): Creat table Employees0LIKE Employees; 3,使用SQL语句删除表和数据库 删除表employees: Drop table employees; 删除数据库YGGL Drop database YGGL;

在VB 中调用动态连接库

在VB 中调用动态连接库 作为一种简单易用的Windows开发环境,Visual Basic从一推出就受到了广大编程人员的欢迎。它使程序员不必再直接面对纷繁复杂的Windows消息,而可以将精力主要集中在程序功能的实现上,大大提高了编程效率。但凡事有利必有弊。 VB中高度的封装和模块化减轻了编程者的负担,同时也使开发人员失去了许多访问低层API函数和直接与Windows交互的机会。因此,相比而言,VB应用程序的执行效率和功能比C/C++或Delphi生成的程序要差。为了解决这个问题,在一个大型的VB开发应用中,直接调用Windows API函数几乎是不可避免的;同时,还有可能需要程序员自己用C/C++等开发一些动态连接库,用于在VB中调用。本文主要讨论在32位开发环境Visual Basic 5.0中直接调用Windows 95 API函数或用户生成的32位动态连接库的方法与规则。 Windows动态连接库是包含数据和函数的模块,可以被其它可执行文件(EXE、 DLL、OCX 等)调用。动态连接库包含两种函数:输出(exported)函数和内部(internal)函数。输出函数可以被其它模块调用,而内部函数则只能在动态连接库内部使用。尽管动态连接库也能输出数据,但实际上它的数据通常是只在内部使用的。使用动态连接库的优点是显而易见的。将应用程序的一部分功能提取出来做成动态连接库,不但减小了主应用程序的大小,提高了程序运行效率,还使它更加易于升级。多个应用程序共享一个动态连接库还能有效地节省系统资源。正因为如此,在Windows系统中,动态连接库得到了大量的使用。 一般来说,动态连接库都是以DLL为扩展名的文件,如 Kernel32.dll、commdlg.dll等。但也有例外,如16位Windows的核心部件之一GDI.exe其实也是一个动态库。编写动态连接库的工具很多,如VisualC++、BorlandC++、Delphi等,具体方法可以参见相关文档。下面只以Visual C++5.0为例,介绍一下开发应用于VisualBasic5.0的动态连接库时应注意的问题(本文中所有涉及C/C++语言或编译环境的地方,都以 VC5为例;所有涉及VisualBasic的地方都以VB5 为例)。 作为一种32位Windows应用程序的开发工具,VB5生成的exe文件自然也都是32位的,通常情况下也只能调用32位的动态连接库。但是,并不是所有的32位动态库都能被VB生成的exe 文件正确地识别。一般来说,自己编写用于VB应用程序调用的动态连接库时,应注意以下几个方面的问题: 1、生成动态库时要使用__stdcall调用约定,而不能使用缺省的__cdecl 调用约定;__stdcall 约定通常用于32位API函数的调用。 2、在VC5中的定义文件(.def)中,必须列出输出函数的函数名,以强制VC5系统将输出函数的装饰名(decoratedname)改成普通函数名;所谓装饰名是VC的编译器在编译过程中生成的输出函数名,它包含了用户定义的函数名、

VC++ MFC DLL动态链接库编写详解

VC++ MFC DLL动态链接库编写详解(2008-07-10 17:38:40) 标签:it分类:com技术然能用DLL实现的功能都可以用COM来替代,但DLL的优点确实不少,它更容易创建。本文将讨论如何利用VC MFC来创建不同类型的DLL,以及如何使用他们。 一、DLL的不同类型 使用VC++可以生成两种类型的DLL:MFC扩展DLL和常规DLL。常规DLL有可以分为动态连接和静态连接。Visual C++还可以生成WIN32 DLL,但不是这里讨论的主要对象。 1、MFC扩展DLL 每个DLL都有某种类型的接口:变量、指针、函数、客户程序访问的类。它们的作用是让客户程序使用DLL,MFC扩展DLL可以有C++的接口。也就是它可以导出C++类给客户端。导出的函数可以使用C++/MFC数据类型做参数或返回值,导出一个类时客户端能创建类对象或者派生这个类。同时,在DLL中也可以使用DLL和MFC。 Visual C++使用的MFC类库也是保存在一个DLL中,MFC扩展DLL动态连接到MFC代码库的DLL,客户程序也必须要动态连接到MFC代码库的DLL。(这里谈到的两个DLL,一个是我们自己编写的DLL,一个装MFC类库的DLL)现在MFC代码库的DLL也存在多个版本,客户程序和扩展DLL都必须使用相同版本的MFC代码DLL。所以为了让MFC扩展DLL能很好的工作,扩展DLL和客户程序都必须动态连接到MFC代码库DLL。而这个DLL必须在客户程序运行的计算机上。 2、常规DLL 使用MFC扩展DLL的一个问题就是DLL仅能和MFC客户程序一起工作,如果需要一个使用更广泛的DLL,最好采用常规DLL,因为它不受MFC的某些限制。常规DLL也有缺点:它不能和客户程序发送指针或MFC派生类和对象的引用。一句话就是常规DLL和客户程序的接口不能使用MFC,但在DLL和客户程序的内部还是可以使用MFC。 当在常规DLL的内部使用MFC代码库的DLL时,可以是动态连接/静态连接。如果是动态连接,也就是常规DLL需要的MFC代码没有构建到DLL中,这种情况有点和扩展DLL类似,在DLL运行的计算机上必须要MFC代码库的DLL。如果是静态连接,常规DLL里面已经包含了需要的MFC代码,这样DLL的体积将比较大,但它可以在没有MFC代码库DLL的计算机上正常运行。 二、建立DLL 利用Visual C++提供的向导功能可以很容易建立一个不完成任何实质任务的DLL,这里就不多讲了,主要的任务是如何给DLL添加功能,以及在客户程序中利用这个DLL 1、导出类 用向导建立好框架后,就可以添加需要导出类的.cpp .h文件到DLL中来,或者用向导创建C++ Herder File/C++ Source File。为了能导出这个类,在类声明的时候要加“_declspe c(dllexport)”,如:

人力资源管理系统使用说明书

人力资源管理系统使用说明书

人力资源管理系统 人力资源管理系统是吉林省明日科技有限公司根据企业的实际需求开发而成,经过系统把几乎所有与人力资源相关的数据统一管理,形成了集成的信息源;使得人力资源管理人员得以摆脱繁重的日常工作,集中精力从战略的角度来考虑企业人力资源规划和政策。 读者将系统的原程序拷贝到本地计算机后,去掉文件夹的只读属性,按照《安装配置说明书》内容附加完系统数据库、配置完成服务器后,便可在本地计算机上运行网站了。 人力资源管理系统的登录界面如图 1.1所示,输入用户名:admin 密码:admin 单击【提交】按钮,进入如图1.2所示的人资源管理系统。 图1.1 人力资源管理系统登录

图1.2 人力资源管理系统 人力资源管理系统主要包括:人员管理、招聘管理、培训管理、奖惩管理和薪金管理五大管理模块。 1.1 人员管理 人员管理主要包括浏览人员信息和添加人员信息两部分。经过这两个部分基本实现了人员的系统化管理。 单击【添加人员信息】按钮,系统自动进入如图 1.3所示的界面。经过该界面能够添加人员信息。

图1.3 添加人员信息 单击“人员姓名”、“登录密码”、“出生日期”和“人员简介”的文本框,输入相关内容,勾选“性别”选项,勾选“是否管理员”选项,最后单击【提交】按钮即完成添加操作。同时系统自动进入浏览人员信息的界面。 图1.4 浏览人员信息 单击相应人员信息后的【修改】按钮,在系统弹出的修改人员信息的列表中单击各文本框即可进行修改,最后单击【提交】按钮即完成修改操作。 单击相应人员信息后的【删除】按钮即可删除相应的人员信息。

演练:创建和使用动态链接库 (C++)

Visual C++ 指导教程 演练:创建和使用动态链接库(C++) Visual Studio 2010 其他版本 0(共1)对本文的评价是有帮助评价此主题 我们将创建的第一种类型的库是动态链接库(DLL)。使用DLL 是一种重用代码的绝佳方式。您不必在自己创建的每个程序中重新实现同一例程,而只需对这些例程编写一次,然后从需要该功能的应用程序引用它们即可。 本演练涵盖以下内容: ?创建新的动态链接库(DLL) 项目。 ?向动态链接库添加类。 ?创建引用动态链接库的应用程序。 ?在控制台应用程序中使用类库的功能。 ?运行应用程序。 系统必备 本主题假定您具备C++ 语言的基础知识。如果您是刚开始学习C++,建议您参阅Herb Schildt 编写的“C++ Beginner's Guide”(《C++ 初学者指南》),该书可从 https://www.360docs.net/doc/c710232946.html,/fwlink/?LinkId=115303在线获得。 创建新的动态链接库(DLL) 项目 1.从“文件”菜单中,选择“新建”,然后选择“项目…”。 2.在“项目类型”窗格中,选择“Visual C++”下的“Win32”。 3.在“模板”窗格中,选择“Win32 控制台应用程序”。 4.为项目选择一个名称,如MathFuncsDll,并将其键入“名称”字段。为解决方案选择一个名 称,如DynamicLibrary,并将其键入“解决方案名称”字段。 5.单击“确定”启动Win32 应用程序向导。在“Win32 应用程序向导”对话框的“概述”页中, 单击“下一步”。

6.在“Win32 应用程序向导”中的“应用程序设置”页中,选择“应用程序类型”下的“DLL”(如果 可用),或者选择“控制台应用程序”(如果“DLL”不可用)。某些版本的Visual Studio 不支持通过使用向导创建DLL 项目。您可以稍后对此进行更改,以将项目编译为DLL。 7.在“Win32 应用程序向导”的“应用程序设置”页中,选择“附加选项”下的“空项目”。 8.单击“完成”创建项目。 向动态链接库添加类 1.若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。将显示“添加新项”对话框。 在“类别”窗格中,选择“Visual C++”下的“代码”。在“模板”窗格中选择“头文件(.h)”。为 头文件选择一个名称,如MathFuncsDll.h,并单击“添加”。将显示一个空白文件。 2.添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。代 码应与以下内容类似: 复制 // MathFuncsDll.h namespace MathFuncs { class MyMathFuncs { public: // Returns a + b static __declspec(dllexport) double Add(double a, double b); // Returns a - b static __declspec(dllexport) double Subtract(double a, dou ble b); // Returns a * b static __declspec(dllexport) double Multiply(double a, dou ble b); // Returns a / b // Throws DivideByZeroException if b is 0 static __declspec(dllexport) double Divide(double a, doubl e b); }; } 3.请注意此代码方法声明中的__declspec(dllexport)修饰符。这些修饰符使DLL 能够导出 该方法以供其他应用程序使用。有关更多信息,请参见dllexport, dllimport。

人事部标准操作手册

目录 引言 1. 编写目的. 2. 手册范围. 3. 职责第一部分人事部岗位操 作规程. 1. 人事专员岗位标准操作规程 2. 培训专员岗位标准操作规程 13

第二部分办公室卫生标准规程.18 13

引言 1. 编写目的 为整合公司各部门的工作协调能力,加强部门相互的配合度从而提高工作效率,特制作此手册。适用于公司人事部各岗位职工,请详细阅读并妥善保管。 2. 手册范围 本手册简要地介绍本部门结构各岗位职责以及具体工作方法及其详细的操作步骤和卫生标准。关于工作用具详细结构、安装及运行维护方面的内容,请参考工作用具的《安装手册》及《运行维护手册》。 本手册的使用岗位包括: 人事专员岗位、培训专员岗位等。 3. 职责 人事部:负责本标准操作规程的实施。 人力资源部:监督本标准操作规程的执行。 行政部:监督办公室卫生标准规程的执行

第一部分人事部岗位操作规程 1.人事专员岗位标准操作规程 1.1在人事主管的领导下负责公司人事工作,对有关人事工作给出 合理的建议或意见 1.1.1做好与各部门工作对接。 1.1.2协助主管领导建立本部门工作章程:相关的人资制度,考核培训制度,薪酬制度等。 1.1.3每年12月前根据制度运行中发现的问题,协助完成制度修订工作;根据一年工作中涉及的问题及时提出问题并且提出解决方法。 1.2负责按用人标准配备齐全各岗人才,做好人才挖掘、引进工作 每日的招聘职位刷新:前程无忧,智联招聘,医药英才网。 1.2.1 1.2.2招聘网站的后台信息管理:职位的增加、减少、暂停、再发布 等。 1.2.3寻找有效的招聘渠道,利用各种招聘渠道进行发布招聘信息: 现场招聘、人才供需见面会、校园招聘、人才市场等。

实验2 数据库的创建和管理

实验2 数据库的创建和管理 学号: 2011193158 姓名:韩江玲 一、实验目的: 1、掌握使用企业管理器创建SQL Server数据库的方法; 2、掌握使用T-SQL语言创建SQL Server数据库的方法; 3、掌握附加和分离数据库的方法; 4、掌握使用企业管理器或存储过程查看SQL数据库属性的方法; 5、熟悉数据库的收缩、更名和删除; 6、掌握使用企业管理器或sp_dboption存储过程修改数据库选项的方法。 二、实验内容和步骤: 本次实验所创建数据库(包括数据库文件和事务日志)存放位置都为“D:\TestDB”。因此首先在D盘下新建文件夹TestDB。 1. 数据库的创建 创建数据库的过程实际上就是为数据库设计名称、设计所占用的存储空间和文件存放位置的过程。 实验内容1:使用SQL Server企业管理器创建一个数据库,具体要求如下: 1)数据库名称为Test1。 2)主要数据文件:逻辑文件名为Test1_Data1,物理文件名为Test1_Data1.mdf,初始容量为1MB,最大容量为10MB,递增量为1MB。 3)次要数据文件:逻辑文件名为Test1_Data2,物理文件名为Test1_Data2.ndf,初始容量为1MB,最大容量为10MB,递增量为1MB。 4)事务日志文件:逻辑文件名为Test1_Log,物理文件名为Test1_Log.ldf,初始容量为1MB,大容量为5MB,递增量为1MB。其他选项为默认值。

注:我在创建数据库的时候,系统要求主文件(Test1_data1和Test1_data2)的大小不能小于3MB,所以在本例中我设置的主文件的初始大小均为3MB 实验内容2:用Transact-SQL(T-SQL)语句创建数据库,实验步骤:启动“查询分析器”,在编辑窗口输入SQL语句。 用T-SQL语句创建一个名为teach的数据库,它由5MB的主数据文件、2MB 的次数据文件和1MB的日志文件组成。并且主数据文件以2MB的增长速度增长,其最大容量为15MB;次数据文件以10%的增长速度增长,其最大容量为10MB;事务日志文件以1MB增长速度增长,其最大日志文件大小为10MB。运行完语句后,仔细查看结果框中的消息。 提示:在查询分析器中输入如下SQL语句。 CREATE DATABASE teach On (name= teach_data1, filename= 'd:\TestDB\teach_data1.mdf ', size=5,

动态连接库和符号(symbol)

动态连接库和符号(symbol) shared library (.so) "Program Library Howto-Shared Libraries"是很好的材料, 下面的内容多是据此整理的. 定义: Shared libraries are libraries that are loaded by programs when they start. 使用shared library(共享库)会有很多好处, 比如软件升级, 不难想象. 命名约定: 1. soname: 每个共享库都有一个soname, 形式为"libNAME.so.x", 其中x是版本号. 如"libc.so.6". 2. real name: 真正的库文件, 一般形式为"soname.y[.z]", 即"libName.so.x.y[.z]", 其中y是minor number, z是release number, 是可选的. 如"libattr.so.1.1.0". 3. linker name: compiler用来请求库时使用的名字, 一般是没

有版本号的soname. 放置位置& load/preload: 共享库一般放在一些约定的目录下, 如/usr/lib/, /usr/local/lib, /lib/等. 这其实是遵循FHS的, 比如/usr/local/lib下放置的一般是用户开发的库. 在启动程序时, program loader(ld-linux.so.x)会找到并加载程序需要的共享库, loader查找的路径一般就是上述的几个目录, 这些目录在/etc/ld.so.conf文件中配置. 如果只想覆盖共享库的某几个函数, 保持其余函数不变, 则可以将共享库名字和函数名字输入到/etc/ld.so.preload中, 这里面定义的规则会覆盖标准规则. cache arrangement & ldconfig 实际上, 在启动程序时再去搜寻所需的共享库不是高效做法, 所以loader使用了cache. ldconfig的作用就是读取文件 /etc/ld.so.conf, 在各个库目录中, 对共享库设置合适的symbolic link(使得遵守命名约定), 然后写入某种数据到 /etc/ld.so.cache, 这个文件再今后就被其他程序使用, 从而大幅提升了共享库的查找速度.

人力资源管理系统 使用说明书

人力资源管理系统 人力资源管理系统是吉林省明日科技有限公司根据企业的实际需求开发而成,通过系统把几乎所有与人力资源相关的数据统一管理,形成了集成的信息源;使得人力资源管理人员得以摆脱繁重的日常工作,集中精力从战略的角度来考虑企业人力资源规划和政策。 读者将系统的原程序拷贝到本地计算机后,去掉文件夹的只读属性,按照《安装配置说明书》内容附加完系统数据库、配置完成服务器后,便可在本地计算机上运行网站了。 人力资源管理系统的登录界面如图1.1所示,输入用户名:admin 密码:admin 单击【提交】按钮,进入如图1.2所示的人资源管理系统。 图1.1 人力资源管理系统登录 图1.2 人力资源管理系统 人力资源管理系统主要包括:人员管理、招聘管理、培训管理、奖惩管理和薪金管理五大管理模块。 1.1 人员管理 人员管理主要包括浏览人员信息和添加人员信息两部分。通过这两个部分基本实现了人员的系统化管理。 单击【添加人员信息】按钮,系统自动进入如图1.3所示的界面。通过该界面可以添加人员信息。 图1.3 添加人员信息 单击“人员姓名”、“登录密码”、“出生日期”和“人员简介”的文本框,输入相关内容,勾选“性别”选项,勾选“是否管理员”选项,最后单击【提交】按钮即完成添加操作。同时系统自动进入浏览人员信息的界面。 图1.4 浏览人员信息 单击相应人员信息后的【修改】按钮,在系统弹出的修改人员信息的列表中单击各文本框即可进行修改,最后单击【提交】按钮即完成修改操作。 单击相应人员信息后的【删除】按钮即可删除相应的人员信息。 1.2 招聘管理 招聘管理主要包括:添加应聘信息、浏览应聘信息和浏览人才库。从人员信息的添写、浏览到人才信息的入库,保证了人力资源一体化的管理。 单击【添加应聘信息】按钮,界面右侧自动添加应聘信息的界面,如图1.5所示。 图1.5 添加应聘信息 单击姓名、年龄、所学专业、学历、电话、职位、工作经验、毕业学校、Email和详细经历的文本框,输入相关的内容,勾选“性别”选项,最后单击【提交】按钮,系统自动进

VC++ 2017 动态链接库的创建和使用总结

Visual studio c++ 2017 动态链接库的创建和使用总结 一动态链接库的创建两种方式: 1、只有从文件->新建->项目->Windows桌面-> Windows桌面向导->选择“动态链接 库(.dll)->生成解决方案,才会生成.dll和.lib文件。 (1)在头文件声明中(注意要在头文件变量和函数声明中,而不是在变量和函数的定义中声明),不加extern “C”修饰,编译成DLL后,用depends.exe查看导出函数名。 可以看出,导出的函数名都被编译器篡改了。

(2)在头文件声明中,变量和函数名前加extern “C”修饰后,编译成DLL后,再用depends.exe查看导出函数名。 可以看出,用extern “C”修饰的函数名,编译后函数名保持不变。类及成员函数不能用extern “C”修饰,编译成DLL后,成员函数名发生了改变。 2、如果从文件->新建->项目->动态链接库(DLL)->生成解决方案,就只生成.dll,不生成.lib。

二动态链接库的调用两种方式: 1、显式调用 (1)使用显式调用的前提:创建的DLL,编译时不要篡改函数名称,定义函数名时,可用extern “C”修饰函数名,保证编译时,函数名不被篡改。否则GetProcAddress( )不能正确地获取dll中的函数名。 但是导出的类不能使用extern “C”修饰。 (2)使用显式调用的优点:不用动态链接库的.h和.lib文件,只要有.dll文件就可调用库函数,使用LoadLibrary(),在需要调用.dll中的库函数时,才动态加载到内存中,使用完毕后,可以用FreeLibrary()释放内存中的dll;使用GetProcAddress( )获取dll中的函数名。必须事先知道dll中的函数名和形式参数。 (3)使用显式调用缺点:调用每个函数时,都必须使用 GetProcAddress( )获取dll中的函数名,并转换成原来的函数,比较麻烦。而隐式调用DLL函数,由于使用了DLL的头文件.h,使用起来非常方便。 2、隐式调用 (1)隐式调用DLL函数缺点: 应用程序加载时,在内存中载入DLL动用库中的函数、变量、或类。使用完毕后,DLL 也不会从内存中释放。 .lib包含了库函数的入口,但不包含函数代码,应用程序调用时,才从dll中载入。(2)隐式调用DLL函数优点: 应用程序调用dll时,需要.lib和.h文件,在应用程序.exe文件夹debug或者release 中有DLL文件,即.h、.lib和.dll三个文件,在应用程序中直接使用DLL中的类和函数,可以不考虑编译DLL函数和变量名发生改变的问题。不需要像显式调用那样,函数需要 用 GetProcAddress( )一一获取。 隐式调用DLL中的变量、函数和类,有两种方法: (1)在主程序中包含DLL的头文件dll.h,在main( )前加上#pragma comment(lib,”dll.lib”),没有分号,再在debug或release中复制DLL.dll。 (2)在主程序中包含DLL的头文件dll.h,在项目属性->链接器->添加依赖项中加上“dll.lib;“,再在debug或release中复制DLL.dll,即可。

动态链接库编程

VC++动态链接库(DLL)编程 ――理解库 作者:宋宝华e-mail:21cnbao@https://www.360docs.net/doc/c710232946.html, 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL 看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE 独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 对动态链接库,我们还需建立如下概念: (1)DLL的编制与具体的编程语言及编译器无关 只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。 (2)动态链接库随处可见 我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll 和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。 一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll 这个动态链接库中。由此可见DLL对我们来说其实并不陌生。 (3)VC动态链接库的分类 Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。 非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL包含一个继承自

(动态链接库)DLL编写与使用方法

DLL的创建与调用 1、DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数、变量或类。这些可以直接拿来使用。 静态链接库与动态链接库的区别: (1)静态链接库与动态链接库都是共享代码的方式。静态链接库把最后的指令都包含在最终生成的EXE 文件中了;动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。 (2)静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 动态链接库的分类:Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。非MFC动态库不采用MFC 类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。 2、创建一个DLL 2.1 非MFC的DLL 2.1.1声明导出函数: extern “C” __declspec(dllexport) int add(int a, int b); 其中extern “C”为声明为C编译。由于C++编译器在编译的时候会造成其函数名的该变,在其他应用程序中导致函数不可调用,而C编译器则不会在编译后改变其函数名。这样如果用C编译的程序来调用该dll中的函数时,可能会造成找不到该函数。 __declspec(dllexport)表示该函数为DLL输出函数,即其他应用程序可以调用该函数 从dll中声明输出函数有两种方式: (1)另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。 (2)用__declspec(dllexport)来声明函数 如果使用Visual C++来创建dll,对于同样用VC创建的exe来说,调用dll没有什么问题。而如果用其他工具来创建的exe来调用dll,就会出现问题。因为即使你不用C++编译器,Microsoft C编译器也会损害C函数。当用__stdcall将函数输出时,C编译器会将函数改为_func@1的形式。在这里需要在.def 文件中加入EXPORTS节来输出函数: EXPORTS func 这样,dll将用func函数名来输出函数。 另一种方式是用#pragma (linker, “/exports:func=_func@1”),告诉编译器输出函数func,这种方式没有前一种好。 如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall方式,WINAPI都采用这种方式,而C/C++ 缺省的调用方式却为__cdecl。__stdcall方式与__cdecl对函数名最终生成符号的方式不同。若采用C编译方式(在C++中需将函数声明为extern "C"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_functionname@number;

相关文档
最新文档