QT 调用动态库

#include "mainwindow.h"
#include "./ui_mainwindow.h"
//#include "QDebug"
#include "QLibrary"
#include "QMessageBox"

//ID读卡器函数声明
typedef  unsigned char (*idr_beep)(unsigned long xms);

typedef  unsigned char (*idr_read)(unsigned char *serial);

typedef  unsigned char  (*idr_read_once)(unsigned char *serial);

typedef  unsigned char  (*pcdgetdevicenumber)(unsigned char *devicenumber);


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()//让设备发出声
{

    unsigned char result;
    QLibrary mylib("OUR_IDR.dll");
    if (!mylib.load())                //判断是否正确加载
    {
        QMessageBox::information(NULL, "提示", "动态库没装载!原因是动态库OUR_IDR.dll没放在生成exe文件相同目录下!");
        return;
    }

    idr_beep myidr_beep = (idr_beep)mylib.resolve("idr_beep");
    if (myidr_beep == NULL)                   //是否成功连接上 idr_beep()函数
    {
        mylib.unload();
        QMessageBox::information(NULL, "提示", "请检查函数名是否正确!");
        return;

    }


    result = myidr_beep(30);      //这里函数指针调用dll中的idr_beep() 函数
    mylib.unload();
    if(result > 0)
    {
        if(result == 23)
        {
            QMessageBox::information(NULL, "提示", "机器没连上或者驱动没下载");
        }
        else
        {
            QMessageBox::information(NULL, "提示", "错误代码:" + QString::number(result));
        };
    }
    //qDebug()<<result;


}


void MainWindow::on_pushButton_2_clicked() //读出设备全球唯一的设备编号,作为加密狗使用
{


    unsigned char devicenumber[4];
    unsigned char result;
    QLibrary mylib("OUR_IDR.dll");    //动态库加载
    if (!mylib.load())                //判断是否正确加载
    {
        QMessageBox::information(NULL, "提示", "动态库没装载!原因是动态库OUR_IDR.dll没放在生成exe文件相同目录下!");
        return;
    }

    pcdgetdevicenumber mypcdgetdevicenumber = (pcdgetdevicenumber)mylib.resolve("pcdgetdevicenumber");
    if (mypcdgetdevicenumber == NULL)                   //是否成功连接上 pcdgetdevicenumber()函数
    {
        mylib.unload();
        QMessageBox::information(NULL, "提示", "请检查函数名是否正确!");
        return;

    }


    result = mypcdgetdevicenumber(devicenumber);
    mylib.unload();
    if(result > 0)
    {
        if(result == 23)
        {
            QMessageBox::information(NULL, "提示", "机器没连上或者驱动没下载");
        }
        else
        {
            QMessageBox::information(NULL, "提示", "错误代码:" + QString::number(result));
        }
    }
    else
    {
        QMessageBox::information(NULL, "提示", QString::asprintf("设备号十六进制数:%02X-%02X-%02X-%02X", devicenumber[0],devicenumber[1],devicenumber[2],devicenumber[3]));
        //QMessageBox::information(NULL, "提示", "设备号十六进制:" + QString::number(devicenumber[0],16) + "-"+ QString::number(devicenumber[1],16) + "-" + QString::number(devicenumber[2],16) + "-" + QString::number(devicenumber[3],16));
    }
    qDebug()<<result;

}


void MainWindow::on_pushButton_3_clicked() //读卡
{

    unsigned char serial[5];
    unsigned char result;

    QLibrary mylib("OUR_IDR.dll");    //动态库加载
    if (!mylib.load())                //判断是否正确加载
    {
        QMessageBox::information(NULL, "提示", "动态库没装载!原因是动态库OUR_IDR.dll没放在生成exe文件相同目录下!");
        return;
    }

    idr_read myidr_read = (idr_read)mylib.resolve("idr_read");
    if (myidr_read == NULL)                   //是否成功连接上 idr_read()函数
    {
        mylib.unload();
        QMessageBox::information(NULL, "提示", "请检查函数名是否正确!");
        return;
    }


    result = myidr_read(serial);

    if(result > 0)
    {
        mylib.unload();

        if(result == 8)
        {
            QMessageBox::information(NULL, "提示", "卡不在感应区内或者寻找不到卡");
        }
        else  if(result == 23)
        {
            QMessageBox::information(NULL, "提示", "机器没连上或者驱动没下载");
        }
        else if(result == 24)
        {
            QMessageBox::information(NULL, "提示", "通讯超时");
        }
        else
        {
            QMessageBox::information(NULL, "提示", "错误代码:" + QString::number(result));
        }
    }
    else
    {
        ui->textEdit->setText(QString::asprintf("%02X%02X%02X%02X%02X",serial[0],serial[1],serial[2],serial[3],serial[4]));

        idr_beep myidr_beep = (idr_beep)mylib.resolve("idr_beep");
        if (myidr_beep == NULL)                   //是否成功连接上 idr_beep()函数
        {
            mylib.unload();
            QMessageBox::information(NULL, "提示", "请检查函数名是否正确!");
            return;

        }


        myidr_beep(30);      //这里函数指针调用dll中的idr_beep() 函数
        mylib.unload();

    }


}


void MainWindow::on_pushButton_4_clicked() //仅读一次,重新取放卡才能读到第二次[返回
{

    unsigned char serial[5];
    unsigned char result;
    QLibrary mylib("OUR_IDR.dll");    //动态库加载
    if (!mylib.load())                //判断是否正确加载
    {
        QMessageBox::information(NULL, "提示", "动态库没装载!原因是动态库OUR_IDR.dll没放在生成exe文件相同目录下!");
        return;
    }

    idr_read_once myidr_read_once = (idr_read_once)mylib.resolve("idr_read_once");
    if (myidr_read_once == NULL)                   //是否成功连接上 idr_read_once()函数
    {
        mylib.unload();
        QMessageBox::information(NULL, "提示", "请检查函数名是否正确!");
        return;
    }


    result = myidr_read_once(serial);
    if(result > 0)
    {
        mylib.unload();

        if(result == 23)
        {
            QMessageBox::information(NULL, "提示", "机器没连上或者驱动没下载");
        }
        else if(result == 24)
        {
            QMessageBox::information(NULL, "提示", "通讯超时");
        }
        else if(result == 8)
        {
            QMessageBox::information(NULL, "提示", "卡不在感应区内或者寻找不到卡");
        }
        else
        {
            QMessageBox::information(NULL, "提示", "错误代码:" + QString::number(result));
        }
    }
    else
    {
        ui->textEdit->setText(QString::asprintf("%02X%02X%02X%02X%02X",serial[0],serial[1],serial[2],serial[3],serial[4]));

        idr_beep myidr_beep = (idr_beep)mylib.resolve("idr_beep");
        if (myidr_beep == NULL)                   //是否成功连接上 idr_beep()函数
        {
            mylib.unload();
            QMessageBox::information(NULL, "提示", "请检查函数名是否正确!");
            return;

        }


        myidr_beep(30);      //这里函数指针调用dll中的idr_beep() 函数
        mylib.unload();

    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值