Qt调用动态链接库ControlCAN.dll实例

2023-05-16

注意:


controlCan引用静态库时需要将kerneldlls文件夹放置程序的输出路径下设备才能链接成功  

首先添加外部库文件(lib文件)

一.添加第三方的头文件

这个问题再简单不过了,不过我还是要说下。

首先,添加头文件  #include "ControlCAN.h"

然后,再将这个头文件放到工程的目录下,就OK了,非常的简单

二.添加.lib文件

首先,将.lib文件放到对应的工程目录下(当然,放到其他路径也可以)。

           但是,仅仅做这一步是不行的,工程不会主动去包含这个.lib文件,你必须告诉他,lib文件在哪里,才可以。

然后,在QT的工程中,你会看到一个.pro文件,比如,我的工程名为test_qt,那么我的文件就是test_qt.pro文件,在整 个QT界面的左上角,.pro文件是管理整个工程的,当要打开一个工程的时候,只要打开.pro,就可以打开整个工 程的所有东西。

        所以,我们要做的,就是在.pro文件中,加上一句话,告诉工程,.lib在哪里

LIBS += -LE:/project/QT/usbcan_info/ -lControlCAN

下面对这句话进行解析:

1)+=这个符号是连接在一起的,不要自做聪明,给分开了,写成+ = ,这样就是错的!

2)+=的左右两边可以有空格,也可以没有空格,随意的

3)-L之后紧接着就跟着.lib文件所在的目录,比如,我的目录是在E盘下的project目录下的QT目录下的usbcan_info下,注意,是紧跟着,不要分开,分开就错啦!

4)-l后面跟着的是.lib的文件名,注意,比如你的.lib文件时ControlCAN.lib,不要傻乎乎的写成了-lControlCAN.lib,不要带后缀,要写成-lControlCAN,同样,-l后面也没有空格

完成以上的操作,就可以指定.lib文件了。其实说穿了很简单,就是把.lib随便放到一个目录下,然后告诉工程,你的.lib放到哪里了,叫什么名字。

三.添加.dll文件

一个工程编译成功后,会在工程目录下生成2个目录,一个是debug目录,一个是release目录(注意,如果一个工程刚刚新建,是没有这2二个目录的,不信的朋友可以看看)。

其中,debug就叫做输出目录!因为工程编译后的.exe就在这个目录下。

然后,将.dll文件放到这个目录下。

/*****************************

1.
将ControlCAN.dll和ControlCAN.h拷贝到工程源文件所在的文件夹下

2.
在 工程名.pro 文件内加入,如图所示

LIBS += D:/Qt/CAN_ComPro/debug/ControlCAN.dll
3.
库函数的显示调用(以  VCI_OpenDevice为例):

#include <QLibrary>
#include <QDebug>
#include "ControlCAN.h"
typedef DWORD(__stdcall VCI_OpenDevice)(DWORD,DWORD,DWORD);
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //导入库
    QLibrary lib("ControlCAN.dll");
    if(true==lib.load())
        qDebug()<<"dll load ok";
    //从库中解析函数
    pOpenDevice = (VCI_OpenDevice *)lib.resolve("VCI_OpenDevice");
    //调用函数
    pOpenDevice(4, 0, 0);
    return a.exec();
}
/*******************************

1 连接USB-CAN II设备
示例代码如下:

void Ctbox_CarSimulatorDlg::OnBnClickedBtConnect()
{
    // TODO: Add your control notification handler code here
    if(m_connect ==true){    //如果已经连接
        m_connect =false;
        Sleep(500);
        GetDlgItem(IDC_BT_CONNECT)->SetWindowText("连接");
        VCI_CloseDevice(VCI_USBCAN2,0);
        return;
    }
 
    //如果未连接
    UpdateData(true);
    VCI_INIT_CONFIG init_config;
    memset(&init_config,0,sizeof(VCI_INIT_CONFIG));
    init_config.AccCode=0;                    //验收码
    init_config.AccMask=0xffffffff;                    //屏蔽码
    init_config.Filter=1;                //过滤方式
    init_config.Mode=0;                        //模式
    init_config.Timing0=0;                //定时器0
    init_config.Timing1=0x1c;                //定时器1
 
    //打开设备
    if(VCI_OpenDevice(VCI_USBCAN2,0,0)!=STATUS_OK)
    {
        MessageBox("打开设备失败!","警告",MB_OK|MB_ICONQUESTION);
        return;
    }
    //初始化CAN
    if(VCI_InitCAN(VCI_USBCAN2,0,m_channel_sel,&init_config)!=STATUS_OK)
    {
        MessageBox("初始化CAN失败!","警告",MB_OK|MB_ICONQUESTION);
        VCI_CloseDevice(0,0);
        return;
    }
    //启动CAN
    if(VCI_StartCAN(VCI_USBCAN2,0,m_channel_sel)!=1)
    {
        MessageBox("启动CAN失败!","警告",MB_OK|MB_ICONQUESTION);
        VCI_CloseDevice(0,0);
        return;
    }
    m_connect=1;
    GetDlgItem(IDC_BT_CONNECT)->SetWindowText("断开");
}

注:这里,定时器0必须设备为0,定时器必须设备为0x1c,在PC上才能正常工作,不然调用发送接口时老是会返回错误。

2 发送CAN消息
VCI_CAN_OBJ frameinfo;
 
frameinfo.DataLen =8;
frameinfo.RemoteFlag =0;
frameinfo.ExternFlag =0;
frameinfo.SendType =0;
frameinfo.ID =CAN_ID_LOCK;
frameinfo.Data[1] =lock;
VCI_Transmit(VCI_USBCAN2,0,dlg->m_channel_sel,&frameinfo,1);
3 接收CAN消息
接收CAN消息一般是通过个线程来实现,如下:

UINT Ctbox_CarSimulatorDlg::ReceiveThread(void * param)
{
    Ctbox_CarSimulatorDlg *dlg =(Ctbox_CarSimulatorDlg *)param;
 
    VCI_CAN_OBJ frameinfo[50];
    VCI_ERR_INFO errinfo; 
    int len=1; 
    int i=0; 
    while(1){
        Sleep(100);
        if(!dlg->m_connect){
            continue;
        }
        len=VCI_Receive(VCI_USBCAN2,0,dlg->m_channel_sel,frameinfo,50,200);  
        if(len<=0){
            //注意:如果没有读到数据则必须调用此函数来读取出当前的错误码,  
            //千万不能省略这一步(即使你可能不想知道错误码是什么)  
            VCI_ReadErrInfo(VCI_USBCAN2,0,dlg->m_channel_sel,&errinfo); 
        }
        else{
            //数据处理
            for(i=0;i<len;i++){
                switch(frameinfo[i].ID){
                case CANID_RC_HEAD_LIGHT:
                case CANID_RC_HORN:
                case CANID_RC_LOCK:
                    dlg->m_remote_control_page.SetStatus(frameinfo[i].ID,8,frameinfo[i].Data);
                    break;    
                default:
                    break;
                }
            }
        }
 
    }
    return 0;
}

在对话框的初始化函数中启动此接收线程:

AfxBeginThread(ReceiveThread,this);

4 复位CAN
void Ctbox_CarSimulatorDlg::OnBnClickedBtReset()
{
    // TODO: Add your control notification handler code here
    if(m_connect==0){
        AfxMessageBox("还未连接!",0);
        return;
    }
    //复位CAN
    if(VCI_ResetCAN(VCI_USBCAN2,0,m_channel_sel)!=1)
    {
        AfxMessageBox("复位失败",0);
    }
    //启动CAN
    if(VCI_StartCAN(VCI_USBCAN2,0,m_channel_sel)!=1)
    {
        MessageBox("启动CAN失败!","警告",MB_OK|MB_ICONQUESTION);
        VCI_CloseDevice(0,0);
        return;
    }
    AfxMessageBox("复位成功",0);    
}
 

5 其它
工程中必须包含SDK中提供到lib文件及头文.

即可VS2010的工程属性页面的Linker->Input->Addtional Dependencies一栏中设置为:./ControlCAN.lib;%(AdditionalDependencies)

然后将.cpp文件中包含头文:

#include "ControlCAN.h"
最后需要将USB-CAN II SDK中提供的ControlCAN.dll及kerneldlls文件夹拷贝到工程目录下,程序才能正常运行。

如上示例代码即可操作USB-CAN II设备。
参考资料:CAN 接口函数库(二次开发库) - 豆丁网

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt调用动态链接库ControlCAN.dll实例 的相关文章

随机推荐

  • Windows句柄-2

    这里需要说明 xff1a 1 这里将句柄所能标识的所有东西 xff08 如窗口 文件 画笔等 xff09 统称为 对象 2 图中一个小横框表示一定大小的内存区域 xff0c 并不代表一个字节 xff0c 如标有0X00000AC6的横框表示
  • Windows消息机制详解-6

    消息系统对于一个win32程序来说十分重要 xff0c 它是一个程序运行的动力源泉 一个消息 xff0c 是系统定义的一个32位的值 xff0c 他唯一的定义了一个事件 xff0c 向 Windows发出一个通知 xff0c 告诉应用程序某
  • TranslateMessage ,GetMessage, DispatchMessage分析

    TranslateMessage amp msg TranslateMessage是用来把快捷键消息转换为字符消息 并将转换后的新消息投递到调用线程的消息队列中 由于Windows对所有键盘编码都是采用虚拟键的定义 xff0c 这样当按键按
  • Windows消息机制-PreTranslateMessage

    PreTranslateMessage作用和使用方法 Windows消息机制的流程 xff1a A 操作系统接收应用程序的窗口消息 xff0c 将消息投递到该应用程序的消息队列中 B 应用程序在消息循环中调用GetMessage函数从消息队
  • 线程中发送消息阻塞问题解决

    发送消息时阻塞的两种方案1 此处应post发送消息放到消息队列中 xff0c 直接send调用响应过程的话如果消息响应未结束则会一直阻塞工作线程2 用send的话在此处开辟工作线程执行逻辑
  • qt+visa实现程控实例

    软件环境 系统 windows 10开发环境 Qt 5 80visa库版本 visa 6 0 软件下载 QtNI MAXIVI 步骤 1 添加依赖库 在Demo pro中添加依赖 win32 INCLUDEPATH 43 61 34 C P
  • Qt中标准对话框实例,QObject::tr()的作用

    函数 tr 全名是QObject tr 被它处理的 字符串可以 使用工具提 取出来翻译 成其他语言 也就是做国际化使用 只要记住 Qt 的最佳实践 如果你想让你的程序国际化的话 那么 所有用户可见的字符串都要使用 QObject tr 但是
  • 公司电脑安装了vncserver,公司电脑安装了vncserver怎么卸载vncserver

    在使用vncserver时感觉很方便 xff0c 但在卸载vncserver时往往比较让人头疼 xff0c 之前公司电脑安装了vncserver使用时我还比较庆幸 xff0c 但当我卸载时真的费了很多力气 xff0c 那今天小编就来教教大家
  • 进程,线程,消息循环的关系

    一个进程有n个线程 xff0c 一个线程有一个消息队列或事件队列和一个活动的消息循环 xff0c 每个模态窗体有一个消息循环函数和一个消息响应过程函数 xff0c 一个线程里哪个模态窗体激活即运行哪个窗体的消息循环 xff0c 一个模态窗体
  • Qt匿名函数的写法

    匿名函数也可以被叫做Lambda表达式 xff0c 自C 43 43 11中引入该特性 本文主要介绍Qt里使用到的匿名函数 c11新特性中加入了lambda表达式 xff0c 所以Qt 也支持 需在 pro文件中加入 CONFIG 43 6
  • QT c++ 中使用PostMessage/SendMessage实例

    PostMessage是Windows API 应用程序接口 中的一个常用函数 xff0c 用于将一条消息放入到消息队列中 并且不会等待响应的线程处理消息 xff0c 而是直接返回 xff08 简单的理解就是异步 xff09 而SendMe
  • Qt-线程启动与关闭实例

    养成资源回收的好习惯 xff0c 任何时候都要想起开辟过的内存回收 就是利用关闭窗口时调用槽函数回收掉 具体步骤不难 xff0c 如下 xff1a 1 xff09 退出线程 xff1b 2 xff09 回收子线程 xff1b 3 xff09
  • qt中QListView的用法和QModelIndex的使用

    使用QTreeView xff0c 对于很多函数中针对item的唯一标识QModelIndex的使用 xff0c 记录下两种对于QModelIdex的使用 1 xff0c 树形结构的item设置为选中 QModelIndex rootInd
  • Qt-QMessageBox用法详解

    QMessageBox 是 Qt 框架中常用的一个类 xff0c 可以生成各式各样 各种用途的消息对话框 xff0c 如图 1 所示 图 1 QMessageBox消息对话框 很多 GUI 程序都会用到消息对话框 xff0c 且很多场景中使
  • Qt-手动布局

    简述 手动布局 xff0c 可以实现和水平布局 垂直布局 网格布局等相同的效果 xff0c 也可实现属于自己的自定义布局 xff0c 当窗体缩放时 xff0c 控件可以随之变化 其对于坐标系的建立有严格要求 xff0c 纯代码思维 xff0
  • Qt-5种布局控件详解

    实际开发中 xff0c 一个界面上可能包含十几个控件 xff0c 手动调整它们的位置既费时又费力 作为一款成熟的 GUI 框架 xff0c Qt 提供了很多摆放控件的辅助工具 xff08 又称布局管理器或者布局控件 xff09 xff0c
  • vnc怎么设置自适应屏幕,2种方法教你vnc怎么设置自适应屏幕

    VNC 是在基于 UNIX和 LINUX 操作系统的免费的开源软件 xff0c 远程控制能力强大 xff0c 高效实用 xff0c 其性能可以和 WIndows和 MAC 中的任何远程控制软件媲美 在使用vnc软件的过程中 xff0c 往往
  • C++中的野指针问题

    文章目录 1 C和C 43 43 中的野指针问题 1 1 野指针的概念 1 2 野指针的由来 1 3 杜绝野指针的基本原则 2 C和C 43 43 中的常见内存错误 2 1 常见内存错误 2 2 内存操作的基本规则 1 C和C 43 43
  • Qt-调用dll动态链接库

    事先写一个简单的dll文件 myDLL dll C版接口的 并且用我前两篇有关DLL文章里面的方法 xff0c 从dll中导出了导入库 lib 文件 xff0c dll中有两个函数 xff0c 原型如下 xff1a void HelloWo
  • Qt调用动态链接库ControlCAN.dll实例

    注意 xff1a controlCan引用静态库时需要将kerneldlls文件夹放置程序的输出路径下设备才能链接成功 首先添加外部库文件 xff08 lib文件 xff09 一 添加第三方的头文件 这个问题再简单不过了 xff0c 不过我