DLL是什么?

【学习记录】C  加载DLL - 图1

DLL怎么用?

【学习记录】C  加载DLL - 图2

例子

  • 环境
    • OS:Windows 10
    • IDE:Visual Studio 2019
  • 说明

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;

  1. //加载DLL
  2. HINSTANCE hdll = LoadLibrary(TEXT("jt900a.dll"));
  3. if (!hdll)
  4. {
  5. perror("load dll failed");
  6. exit(1);
  7. }
  8. printf("load dll ok(0x%08X)\r\n", (long)hdll);
  9. //加载函数
  10. AutoOpenComPort_t AutoOpenComPort = (AutoOpenComPort_t)GetProcAddress(hdll, "AutoOpenComPort");
  11. if (!AutoOpenComPort)
  12. {
  13. perror("load function failed");
  14. FreeLibrary(hdll);
  15. exit(2);
  16. }
  17. printf("load function ok(0x%08X)\r\n",(long)AutoOpenComPort);
  18. //调用函数
  19. long port;
  20. unsigned char addr;
  21. long hjt900a;
  22. long res;
  23. res = AutoOpenComPort(&port, &addr, 5, &hjt900a);
  24. if (!res)
  25. {
  26. printf("call AutoOpenComPort ok\r\n");
  27. printf("Port:COM%d\r\n"
  28. "Address:%d\r\n"
  29. "Handle:0x%08X\r\n",
  30. port,addr,hjt900a);
  31. }
  32. else
  33. {
  34. printf("call AutoOpenComPort failed(%d)\r\n", res);
  35. }
  36. //释放DLL
  37. FreeLibrary(hdll);
  38. printf("DLL free\r\n");
  39. return 0;

}

  1. <a name="dXeQP"></a>
  2. ### 3. 让程序找到DLL
  3. 参考[这里](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)
  4. <a name="kXtWo"></a>
  5. ### 4. 运行程序,观察现象
  6. <a name="tYGYY"></a>
  7. #### 接上读卡器
  8. ![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)
  9. <a name="jXnUS"></a>
  10. #### 不接读卡器
  11. ![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)表示通讯错误,这是因为读卡器没有连接,程序没有收到响应信息
  12. ```cpp
  13. #define InventoryReturnEarly_G2 0x01 询查时间结束前返回
  14. #define InventoryTimeOut_G2 0x02 指定的询查时间溢出
  15. #define InventoryMoreData_G2 0x03 本条消息之后,还有消息
  16. #define ReadermoduleMCUFull_G2 0x04 读写模块存储空间已满
  17. #define AccessPasswordError 0x05 访问密码错误
  18. #define DestroyPasswordError 0x09 销毁密码错误
  19. #define DestroyPasswordCannotZero 0x0a 销毁密码不能为全0
  20. #define TagNotSupportCMD 0x0b 电子标签不支持该命令
  21. #define AccessPasswordCannotZero 0x0c 对该命令,访问密码不能为0
  22. #define TagProtectedCannotSetAgain 0x0d 电子标签已经被设置了读保
  23. 护,不能再次设置
  24. #define TagNoProtectedDonotNeedUnlock 0x0e 电子标签没有被设置读保护,
  25. 不需要解锁
  26. #define ByteLockedWriteFail 0x10 有字节空间被锁定,写入失败
  27. #define CannotLock 0x11 不能锁定
  28. #define LockedCannotLockAgain 0x12 已经锁定,不能再次锁定
  29. #define ParameterSaveFailCanUseBeforeNoPower
  30. 0x13 参数保存失败,但设置的值在
  31. 读写模块断电前有效
  32. #define CannotAdjust 0x14 无法调整
  33. #define InventoryReturnEarly_6B 0x15 询查时间结束前返回
  34. #define InventoryTimeOut_6B 0x16 指定的询查时间溢出
  35. #define InventoryMoreData_6B 0x17 本条消息之后,还有消息
  36. #define ReadermoduleMCUFull_6B 0x18 读写模块存储空间已满
  37. #define NotSupportCMDOrAccessPasswordCannotZero
  38. 0x19 电子不支持该命令或者访问密码不能为0
  39. #define CMDExecuteErr 0xF9 命令执行出错
  40. #define GetTagPoorCommunicationCannotOperation
  41. 0xFA 有电子标签,但通信不畅,无
  42. 法操作
  43. #define NoTagOperation 0xFB 无电子标签可操作
  44. #define TagReturnErrorCode 0xFC 电子标签返回错误代码
  45. #define CMDLengthWrong 0xFD 命令长度错误
  46. #define IllegalCMD 0xFE 不合法的命令
  47. #define ParameterError 0xFF 参数错误
  48. #define CommunicationErr 0x30 通讯错误
  49. #define RetCRCErr 0x31 CRC校验错误
  50. #define RetDataErr 0x32 返回数据长度有错误
  51. #define CommunicationBusy 0x33 通讯繁忙,设备正在执行
  52. 其他指令
  53. #define ExecuteCmdBusy 0x34 繁忙,指令正在执行
  54. #define ComPortOpened 0x35 端口已打开
  55. #define ComPortClose 0x36 端口已关闭
  56. #define InvalidHandle 0x37 无效句柄
  57. #define InvalidPort 0x38 无效端口
  58. #define RecmdErr 0XEE返回指令错误

参考资料