DLL是什么?
DLL怎么用?
例子
- 环境
- OS:Windows 10
- IDE:Visual Studio 2019
- 说明
- RFID读卡器提供的SDK给了一个
jt900a.dll
文件 - 提供了库函数的说明文档(JT900A-L).DLL动态连接库使用手册V2.0.doc
- 尝试使用其中的
AutoOpenComPort()
与读卡器进行握手1. 创建一个新项目
这个项目里只有一个main函数,实现了hello world
2. 编程,显示调用DLL
```cppinclude
- RFID读卡器提供的SDK给了一个
include “windows.h” //HINSTANCE, WINAPI
using namespace std;
//要使用的函数指针类型 typedef long (WINAPI AutoOpenComPort_t) (long Port, unsigned char ComAdr, unsigned char Baud, long FrmHandle); typedef long (WINAPI OpenComPort_t) (long port, unsigned char ComAdr, unsigned char baud, long* FrmHandle);
int main() { cout << “Hello World!” << endl;
//加载DLL
HINSTANCE hdll = LoadLibrary(TEXT("jt900a.dll"));
if (!hdll)
{
perror("load dll failed");
exit(1);
}
printf("load dll ok(0x%08X)\r\n", (long)hdll);
//加载函数
AutoOpenComPort_t AutoOpenComPort = (AutoOpenComPort_t)GetProcAddress(hdll, "AutoOpenComPort");
if (!AutoOpenComPort)
{
perror("load function failed");
FreeLibrary(hdll);
exit(2);
}
printf("load function ok(0x%08X)\r\n",(long)AutoOpenComPort);
//调用函数
long port;
unsigned char addr;
long hjt900a;
long res;
res = AutoOpenComPort(&port, &addr, 5, &hjt900a);
if (!res)
{
printf("call AutoOpenComPort ok\r\n");
printf("Port:COM%d\r\n"
"Address:%d\r\n"
"Handle:0x%08X\r\n",
port,addr,hjt900a);
}
else
{
printf("call AutoOpenComPort failed(%d)\r\n", res);
}
//释放DLL
FreeLibrary(hdll);
printf("DLL free\r\n");
return 0;
}
<a name="dXeQP"></a>
### 3. 让程序找到DLL
参考[这里](https://docs.microsoft.com/zh-cn/troubleshoot/windows-client/deployment/dynamic-link-library#sample-dll-and-application)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/21985934/1645701644590-dad61b88-036f-4f85-9344-e5d185f34c44.png#clientId=uc138e7de-9555-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=467&id=ubf5a3f18&margin=%5Bobject%20Object%5D&name=image.png&originHeight=700&originWidth=889&originalType=binary&ratio=1&rotation=0&showTitle=false&size=77110&status=done&style=none&taskId=ue495badf-d5d4-41c5-97f0-8f83d093d95&title=&width=592.6666666666666)
<a name="kXtWo"></a>
### 4. 运行程序,观察现象
<a name="tYGYY"></a>
#### 接上读卡器
![image.png](https://cdn.nlark.com/yuque/0/2022/png/21985934/1645701868317-d669e1be-ec98-4afc-bff8-24743296c10d.png#clientId=ud1f33c0e-4e0e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=341&id=ue9aa9d32&margin=%5Bobject%20Object%5D&name=image.png&originHeight=512&originWidth=979&originalType=binary&ratio=1&rotation=0&showTitle=false&size=10983&status=done&style=none&taskId=u4b909487-15c7-4092-880b-f4096fd97bd&title=&width=652.6666666666666)
<a name="jXnUS"></a>
#### 不接读卡器
![image.png](https://cdn.nlark.com/yuque/0/2022/png/21985934/1645701813547-9c7b475e-6ee3-4044-b93f-49d3e79e33ec.png#clientId=ud1f33c0e-4e0e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=341&id=u1b19b559&margin=%5Bobject%20Object%5D&name=image.png&originHeight=512&originWidth=979&originalType=binary&ratio=1&rotation=0&showTitle=false&size=10844&status=done&style=none&taskId=ue809958a-05d7-45e8-aad1-401bde344cc&title=&width=652.6666666666666)<br />返回值48(0x30)表示通讯错误,这是因为读卡器没有连接,程序没有收到响应信息
```cpp
#define InventoryReturnEarly_G2 0x01 询查时间结束前返回
#define InventoryTimeOut_G2 0x02 指定的询查时间溢出
#define InventoryMoreData_G2 0x03 本条消息之后,还有消息
#define ReadermoduleMCUFull_G2 0x04 读写模块存储空间已满
#define AccessPasswordError 0x05 访问密码错误
#define DestroyPasswordError 0x09 销毁密码错误
#define DestroyPasswordCannotZero 0x0a 销毁密码不能为全0
#define TagNotSupportCMD 0x0b 电子标签不支持该命令
#define AccessPasswordCannotZero 0x0c 对该命令,访问密码不能为0
#define TagProtectedCannotSetAgain 0x0d 电子标签已经被设置了读保
护,不能再次设置
#define TagNoProtectedDonotNeedUnlock 0x0e 电子标签没有被设置读保护,
不需要解锁
#define ByteLockedWriteFail 0x10 有字节空间被锁定,写入失败
#define CannotLock 0x11 不能锁定
#define LockedCannotLockAgain 0x12 已经锁定,不能再次锁定
#define ParameterSaveFailCanUseBeforeNoPower
0x13 参数保存失败,但设置的值在
读写模块断电前有效
#define CannotAdjust 0x14 无法调整
#define InventoryReturnEarly_6B 0x15 询查时间结束前返回
#define InventoryTimeOut_6B 0x16 指定的询查时间溢出
#define InventoryMoreData_6B 0x17 本条消息之后,还有消息
#define ReadermoduleMCUFull_6B 0x18 读写模块存储空间已满
#define NotSupportCMDOrAccessPasswordCannotZero
0x19 电子不支持该命令或者访问密码不能为0
#define CMDExecuteErr 0xF9 命令执行出错
#define GetTagPoorCommunicationCannotOperation
0xFA 有电子标签,但通信不畅,无
法操作
#define NoTagOperation 0xFB 无电子标签可操作
#define TagReturnErrorCode 0xFC 电子标签返回错误代码
#define CMDLengthWrong 0xFD 命令长度错误
#define IllegalCMD 0xFE 不合法的命令
#define ParameterError 0xFF 参数错误
#define CommunicationErr 0x30 通讯错误
#define RetCRCErr 0x31 CRC校验错误
#define RetDataErr 0x32 返回数据长度有错误
#define CommunicationBusy 0x33 通讯繁忙,设备正在执行
其他指令
#define ExecuteCmdBusy 0x34 繁忙,指令正在执行
#define ComPortOpened 0x35 端口已打开
#define ComPortClose 0x36 端口已关闭
#define InvalidHandle 0x37 无效句柄
#define InvalidPort 0x38 无效端口
#define RecmdErr 0XEE返回指令错误