Qt调用第三方库一般有两种方式,显示和隐式。这里主要介绍显示调用CAN卡第三方库(因为隐式调用CAN失败了,太懒,不想弄了
),简单介绍隐式调用。
一、隐式调用
- 创建工程
- 将xx.h和xx.lib放入当前工程目录
- xx.dll文件放入debug和release文件夹中(编译后自动生成)
- 工程下打开.pro文件,右键选择“添加库”
- 选择“外部库”、“动态库”
- 工程添加头文件xx.h
- 头文件包含“xx.h"
二、显式调用
1、创建工程2、CAN.lib文件夹里有几个文件如下。Kerneldlls中有很多xx.dll文件,如下。将使用的CAN类型对应的.dll文件复制(我使用的是usbcan,所以是usbcan.dll),放到工作目录下,同时复制ControlCAN.h到工作目录下。
3、包含ControlCAN.h到工程中4、使用QLibrary加载动态库QLibrary lib("usbcan.dll"); if(true==lib.load()) qDebug()<<"dll load ok";5、声明与usbcan.dll里的函数功能相对应的函数,在头文件中添加:public: typedef DWORD(__stdcall VCI_OpenDevice)(DWORD,DWORD,DWORD); typedef DWORD(__stdcall VCI_ResetCAN)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd); typedef DWORD(__stdcall VCI_CloseDevice)(DWORD DeviceType,DWORD DeviceInd); typedef DWORD(__stdcall VCI_InitCAN)(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd, PVCI_INIT_CONFIG pInitConfig); typedef DWORD(__stdcall VCI_StartCAN)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd); typedef ULONG(__stdcall VCI_Transmit)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pSend,ULONG Len); typedef ULONG(__stdcall VCI_Receive)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pReceive,ULONG Len,INT WaitTime/*=-1*/); typedef ULONG(__stdcall VCI_GetReceiveNum)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd); typedef DWORD(__stdcall VCI_ClearBuffer)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd); typedef DWORD(__stdcall VCI_ReadErrInfo)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_ERR_INFO pErrInfo); typedef DWORD(__stdcall VCI_ReadCANStatus)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_STATUS pCANStatus); typedef DWORD(__stdcall VCI_SetReference)(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,DWORD RefType,PVOID pData); typedef DWORD(__stdcall VCI_ReadBoardInfo)(DWORD DeviceType,DWORD DeviceInd,PVCI_BOARD_INFO pInfo);6、声明函数对象,如VCI_OpenDevice *pOpenDevice; VCI_ResetCAN *pResetCAN; VCI_CloseDevice *pCloseDevice; VCI_InitCAN *pInitCAN; VCI_StartCAN *pStartCAN; VCI_Transmit *pTransmitCAN; VCI_Receive *pReceive; VCI_GetReceiveNum *pGetReceiveNum; VCI_ClearBuffer *pClearBuffer; VCI_ReadErrInfo *pReadErrInfoCAN; VCI_ReadCANStatus *pReadCANStatus; VCI_SetReference *pSetReference; VCI_ReadBoardInfo *pReadBoardInfo;7、将usbcan.dll中的函数功能分解到自定义对应的函数中,源文件中:pOpenDevice = (VCI_OpenDevice *)lib.resolve("VCI_OpenDevice"); pCloseDevice = (VCI_CloseDevice *)lib.resolve("VCI_CloseDevice"); pInitCAN = (VCI_InitCAN *)lib.resolve("VCI_InitCAN"); pStartCAN = (VCI_StartCAN *)lib.resolve("VCI_StartCAN"); pTransmitCAN = (VCI_Transmit *)lib.resolve("VCI_Transmit"); pReceive = (VCI_Receive *)lib.resolve("VCI_Receive"); pGetReceiveNum = (VCI_GetReceiveNum *)lib.resolve("VCI_GetReceiveNum"); pClearBuffer = (VCI_ClearBuffer *)lib.resolve("VCI_ClearBuffer"); pReadErrInfoCAN = (VCI_ReadErrInfo*)lib.resolve("VCI_ReadErrInfo"); pResetCAN=(VCI_ResetCAN *)lib.resolve("VCI_ResetCAN"); pSetReference=(VCI_SetReference *)lib.resolve("VCI_SetReference"); pReadBoardInfo=(VCI_ReadBoardInfo *)lib.resolve("VCI_ReadBoardInfo"); pReadCANStatus=(VCI_ReadCANStatus *)lib.resolve("VCI_ReadCANStatus");
Qt调用CAN卡DLL教程
),简单介绍隐式调用。
1247

被折叠的 条评论
为什么被折叠?



