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;
//加载DLLHINSTANCE 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);}//释放DLLFreeLibrary(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 /><a name="kXtWo"></a>### 4. 运行程序,观察现象<a name="tYGYY"></a>#### 接上读卡器<a name="jXnUS"></a>#### 不接读卡器<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 ParameterSaveFailCanUseBeforeNoPower0x13 参数保存失败,但设置的值在读写模块断电前有效#define CannotAdjust 0x14 无法调整#define InventoryReturnEarly_6B 0x15 询查时间结束前返回#define InventoryTimeOut_6B 0x16 指定的询查时间溢出#define InventoryMoreData_6B 0x17 本条消息之后,还有消息#define ReadermoduleMCUFull_6B 0x18 读写模块存储空间已满#define NotSupportCMDOrAccessPasswordCannotZero0x19 电子不支持该命令或者访问密码不能为0#define CMDExecuteErr 0xF9 命令执行出错#define GetTagPoorCommunicationCannotOperation0xFA 有电子标签,但通信不畅,无法操作#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返回指令错误
