0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

QT调用动态库开发IC卡读写程序

邹振豪 来源:jf_51178285 作者:jf_51178285 2024-12-30 09:25 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

IC卡特点:
1IC卡的内部存储结构分为16个扇区,从第0区到第15区,每个扇区有独立的密码和权限控制字,可作为卡的密码和权限控制字专用独立的电子钱包,每个扇区有4个块,序号为第0块、第1块、第2块、第3块,每块16个字节,第3块是块,禁止在此存放数据。第0块、第1块、第2块可随意存放数据。但第0区的第0块已被固化了IC卡出厂信息,此块只能读出信息,不可更改。

调用DLL动态库代码:
   unsigned char result;
    QLibrary mylib("OUR_MIFARE.dll");
    if (!mylib.load())                //判断是否正确加载
    {
        QMessageBox::information(NULL, "提示", "动态库没装载!原因是动态库OUR_MIFARE.dll没放在生成exe文件相同目录下!");
        return;
    }
 
    pcdbeep mypcdbeep = (pcdbeep)mylib.resolve("pcdbeep");
    if (mypcdbeep == NULL)                   //是否成功连接上 idr_beep()函数
    {
        mylib.unload();
        QMessageBox::information(NULL, "提示", "请检查函数名是否正确!");
        return;
 
    }
 
 
    result = mypcdbeep(30);      //这里函数指针调用dll中的idr_beep() 函数
    mylib.unload();
    if(result > 0)
    {
        if(result == 23)
        {
            QMessageBox::information(NULL, "提示", "机器没连上或者驱动没下载");
        }
        else
        {
            QMessageBox::information(NULL, "提示", "错误代码:" + QString::number(result));
        };
    }

读出IC卡数据的代码:

void MainWindow::on_pushButton_3_clicked()//轻松读卡
{
   unsigned char ctrlword;//控制字
   unsigned char serial[4];//可写数组
   unsigned char area;//读出的区号
   unsigned char keyA1B0;//AB密码认证
   unsigned char picckey[6];//存放卡密码的数组
   unsigned char piccdata0_2[48];//下标0~15存放作为读出的块0的数据,下标16~31存放作为读出的块1的数据,下标32~47存放作为读出的块2的数据
   unsigned char status;//返回
   unsigned char status1;
   unsigned char result;
   unsigned char piccdata[16];  //卡数据缓冲

   //以下控制字含义:读块0、块1、块2,仅读指定序列号的卡,需要每次指定密码
   if (ui->radioButton->isChecked())
   {

       ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY;

   }
   else
   {//内部密码
       ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN;
   }
   area = ui->comboBox->currentText().toUShort();
   keyA1B0 = 1;//用A密码
   QString Key_str = ui->lineEdit->text().trimmed();

   if(Key_str.length() < 12)
   {
       QMessageBox::information(NULL, "提示", "密码长度不够12位!");
       ui- >lineEdit->setFocus();
       return;

   }

   char c;
   for (int var = 0; var < 12; ++var)
   {
       c = Key_str.at(var).toLatin1();
       if(!((('0' <= c) && (c <= '9')) || (('A' <= c) && (c <= 'F')) || (('a' <= c) && (c <= 'f'))))
       {
         QMessageBox::information(NULL, "提示", "密码输入字符不正确!");
         ui- >lineEdit->setSelection(var,1);
         ui->lineEdit->setFocus();
         return;
       }
   }


   bool ok;
   for(int i = 0; i < 6; i++)
   {
       picckey[i]=QString(Key_str.mid(i*2,2)).toInt(&ok,16);
   }



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

   piccreadex mypiccreadex = (piccreadex)mylib.resolve("piccreadex");
   status = mypiccreadex(ctrlword,serial,area,keyA1B0,picckey,piccdata0_2);

   if(status == 0)
   {
       ui- >lineEdit_2->setText(QString::asprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X ",piccdata0_2[0],piccdata0_2[1],piccdata0_2[2],piccdata0_2[3],piccdata0_2[4],piccdata0_2[5],piccdata0_2[6],piccdata0_2[7],piccdata0_2[8],piccdata0_2[9],piccdata0_2[10],piccdata0_2[11],piccdata0_2[12],piccdata0_2[13],piccdata0_2[14],piccdata0_2[15]));
       ui->lineEdit_3->setText(QString::asprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X ",piccdata0_2[16],piccdata0_2[17],piccdata0_2[18],piccdata0_2[19],piccdata0_2[20],piccdata0_2[21],piccdata0_2[22],piccdata0_2[23],piccdata0_2[24],piccdata0_2[25],piccdata0_2[26],piccdata0_2[27],piccdata0_2[28],piccdata0_2[29],piccdata0_2[30],piccdata0_2[31]));
       ui->lineEdit_4->setText(QString::asprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X ",piccdata0_2[32],piccdata0_2[33],piccdata0_2[34],piccdata0_2[35],piccdata0_2[36],piccdata0_2[37],piccdata0_2[38],piccdata0_2[39],piccdata0_2[40],piccdata0_2[41],piccdata0_2[42],piccdata0_2[43],piccdata0_2[44],piccdata0_2[45],piccdata0_2[46],piccdata0_2[47]));

       piccread mypiccread = (piccread)mylib.resolve("piccread");
       status1 = mypiccread(area * 4 + 3,piccdata);
       if(status1 == 0)
       {
         ui->lineEdit_5->setText(QString::asprintf("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X ",piccdata[0],piccdata[1],piccdata[2],piccdata[3],piccdata[4],piccdata[5],piccdata0_2[6],piccdata[7],piccdata[8],piccdata[9],piccdata[10],piccdata[11],piccdata[12],piccdata[13],piccdata[14],piccdata[15]));

       }

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

       }

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

   }
   else if(status == 8)
   {
       ui->lineEdit_2->clear();
       ui->lineEdit_3->clear();
       ui->lineEdit_4->clear();
       QMessageBox::information(NULL, "提示", "寻卡错误,根本就没有卡在感应区");

   }
   else if(status == 12)
   {
       ui->lineEdit_2->clear();
       ui->lineEdit_3->clear();
       ui->lineEdit_4->clear();
       QMessageBox::information(NULL, "提示", "密码认证失败");

   }

}

写入数据到IC卡的代码:

void MainWindow::on_pushButton_12_clicked()//轻松写卡
{  
   unsigned char serial[4];//可写数组
   unsigned char area;//读出的区号
   unsigned char keyA1B0;//AB密码认证
   unsigned char picckey[6];//存放卡密码的数组
   unsigned char piccdata0_2[48];//下标0~15存放作为读出的块0的数据,下标16~31存放作为读出的块1的数据,下标32~47存放作为读出的块2的数据
   unsigned char status;//返回
   unsigned char result;
   char s;
   //以下控制字含义:读块0、块1、块2,仅读指定序列号的卡,需要每次指定密码
   if (ui->radioButton->isChecked())
   {

       ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY + NEEDHALT;

   }
   else
   {//内部密码
       ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN;
   }



   area = ui->comboBox->currentText().toUShort();
   keyA1B0 = 1;//用A密码

   QString Key_str = ui->lineEdit->text().trimmed();

   if(Key_str.length() < 12)
   {
       QMessageBox::information(NULL, "提示", "密码长度不够12位!");
       ui- >lineEdit->setFocus();
       return;

   }

   char c;
   for (int var = 0; var < 12; ++var)
   {
       c = Key_str.simplified().at(var).toLatin1();
       if(!((('0' <= c) && (c <= '9')) || (('A' <= c) && (c <= 'F')) || (('a' <= c) && (c <= 'f'))))
       {
         QMessageBox::information(NULL, "提示", "密码输入字符不正确!");
         //ui- >lineEdit->setSelection(var,1);
         ui->lineEdit->setSelection(var,1);
         ui->lineEdit->setFocus();
         return;
       }
   }

   bool ok;
   for(int i = 0; i < 6; i++)
   {
       picckey[i]=QString(Key_str.mid(i*2,2)).toInt(&ok,16);
   }

   //第0块数据
   QChar ch;
   QString writinf = ui- >lineEdit_2->text().trimmed();
   QString writinf1 = "";
   int m = 0;
   int n = 0;

   ch = writinf.at(0);
   s = writinf.at(0).toLatin1();
   for(int i=0; i< writinf.length() ; i++)
   {

       ch = writinf.at(i);
       s = writinf.at(i).toLatin1();
       if((('0' <= s) && (s <= '9')) || (('A' <= s) && (s <= 'F')) || (('a' <= s) && (s <= 'f')))
       {
         writinf1 += ch;
         n++;
         if(n==2)
         {
             piccdata0_2[m++] = writinf1.toInt(&ok,16);
             writinf1 = "";
             n = 0;
             if(m >=16)
             {
                 break;
             }
         }
       }
       else if(s == ' ')
       {

       }
       else
       {
         QMessageBox::information(NULL, "提示", "写卡数据错误,请输入正确的16进制数据!");

         ui->lineEdit_2->setSelection(i,1);
         ui->lineEdit_2->setFocus();

         return;

       }
   }

   if(m< 16)
   {
       QMessageBox::information(NULL, "提示", "第0块输入数据不足!");
       ui- >lineEdit_2->setFocus();
       return;
   }


   //第1块数据
   writinf = ui->lineEdit_3->text().trimmed();
   QString writinf2 = "";
   m = 16;
   for(int i=0; i< writinf.length() ; i++)
   {
       ch = writinf.at(i);
       s = writinf.at(i).toLatin1();
       if((('0' <= s) && (s <= '9')) || (('A' <= s) && (s <= 'F')) || (('a' <= s) && (s <= 'f')))
       {
         writinf2 += ch;//12 34
         n++;//2
         if(n==2)
         {
             piccdata0_2[m++] = writinf2.toInt(&ok,16);
             writinf2 = "";
             n = 0;
             if(m >=32)
             {
                 break;
             }
         }
       }
       else if(s == ' ')
       {

       }
       else
       {
         QMessageBox::information(NULL, "提示", "写卡数据错误,请输入正确的16进制数据!");
         qDebug() < < i;
         ui- >lineEdit_3->setSelection(i,1);
         ui->lineEdit_3->setFocus();
         return;
       }
   }
   if(m< 16)
   {
       QMessageBox::information(NULL, "提示", "第1块输入数据不足!");
       ui- >lineEdit_3->setFocus();
       return;
   }


   //第2块数据
   writinf = ui->lineEdit_4->text().trimmed();
   QString writinf3 = "";
   m = 32;
   for(int i=0; i< writinf.length() ; i++)
   {

       ch = writinf.at(i);
       s = writinf.at(i).toLatin1();
       if((('0' <= s) && (s <= '9')) || (('A' <= s) && (s <= 'F')) || (('a' <= s) && (s <= 'f')))
       {
         writinf3 += ch;//12 34
         n++;//2
         if(n==2)
         {
             piccdata0_2[m++] = writinf3.toInt(&ok,16);
             writinf3 = "";
             n = 0;
             if(m >=48)
             {
                 break;
             }
         }
       }
       else if(s == ' ')
       {

       }
       else
       {
         QMessageBox::information(NULL, "提示", "写卡数据错误,请输入正确的16进制数据!");
         ui->lineEdit_4->setSelection(i,1);
         ui->lineEdit_4->setFocus();
         return;

       }
   }

   if(m< 48)
   {
       QMessageBox::information(NULL, "提示", "第2块输入数据不足!");
       ui- >lineEdit_4->setFocus();
       return;
   }

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

   piccwriteex mypiccwriteex = (piccwriteex)mylib.resolve("piccwriteex");
   status = mypiccwriteex(ctrlword,serial,area,keyA1B0,picckey,piccdata0_2);
   if(status == 0)
   {
       pcdbeep mypcdbeep = (pcdbeep)mylib.resolve("pcdbeep");
       if (mypcdbeep == NULL)                   //是否成功连接上 idr_beep()函数
       {
         mylib.unload();
         QMessageBox::information(NULL, "提示", "请检查函数名是否正确!");
         return;

       }
       result = mypcdbeep(30);      //这里函数指针调用dll中的idr_beep() 函数
       mylib.unload();
       QMessageBox::information(NULL, "提示", "写卡成功!");
   }
   else if(status == 8)
   {
       ui->lineEdit_2->clear();
       ui->lineEdit_3->clear();
       ui->lineEdit_4->clear();
       QMessageBox::information(NULL, "提示", "寻卡错误,根本就没有卡在感应区");
   }
   else if(status == 12)
   {
       ui->lineEdit_2->clear();
       ui->lineEdit_3->clear();
       ui->lineEdit_4->clear();
       QMessageBox::information(NULL, "提示", "密码认证失败");
   }
}

修改A,B区密码:

void MainWindow::on_pushButton_14_clicked()
{
   unsigned char ctrlword;//控制字
   unsigned char serial[4];//可写数组
   unsigned char area;//读出的区号
   unsigned char keyA1B0;//AB密码认证
   unsigned char piccoldkey[6];//存放卡原始密码的数组
   unsigned char piccdata[17];//存放卡新A密码(也就是准备改成的密码)、密码权限访问字、新B密码的数组、指定更改项目的标志
   unsigned char status;//返回
   unsigned char result;
   if (ui->radioButton->isChecked())
   {
       ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + EXTERNKEY + NEEDHALT;
   }
   else
   {//内部密码
       ctrlword = BLOCK0_EN + BLOCK1_EN + BLOCK2_EN;
   }

   area = ui->comboBox->currentText().toUShort();
   keyA1B0 = 1;//用A密码
   QString Key_str = ui->lineEdit->text().trimmed();

   if(Key_str.length() < 12)
   {
       QMessageBox::information(NULL, "提示", "密码长度不够12位!");
       ui- >lineEdit->setFocus();
       return;

   }

   char c;
   for (int var = 0; var < 12; ++var)
   {
       c = Key_str.simplified().at(var).toLatin1();
       if(!((('0' <= c) && (c <= '9')) || (('A' <= c) && (c <= 'F')) || (('a' <= c) && (c <= 'f'))))
       {
         QMessageBox::information(NULL, "提示", "密码输入字符不正确!");
         ui- >lineEdit->setSelection(var,1);
         ui->lineEdit->setFocus();
         return;
       }
   }

   bool ok;
   for(int i = 0; i < 6; i++)
   {
       piccoldkey[i]=QString(Key_str.mid(i*2,2)).toInt(&ok,16);
   }


   QChar ch;
   QString writinf = ui- >lineEdit_5->text().trimmed();
   QString writinf4 = "";
   int m = 0;
   int n = 0;
   char s;
   for(int i=0; i< writinf.length() ; i++)
   {

       ch = writinf.at(i);
       s = writinf.at(i).toLatin1();
       if((('0' <= s) && (s <= '9')) || (('A' <= s) && (s <= 'F')) || (('a' <= s) && (s <= 'f')))
       {
         writinf4 += ch;
         n++;
         if(n==2)
         {
             piccdata[m++] = writinf4.toInt(&ok,16);
             writinf4 = "";
             n = 0;
             if(m >=16)
             {
                 break;
             }
         }
       }
       else if(s == ' ')
       {

       }
       else
       {
         QMessageBox::information(NULL, "提示", "写卡数据错误,请输入正确的16进制数据!");
         ui->lineEdit_5->setSelection(i,1);
         ui->lineEdit_5->setFocus();
         return;

       }
   }

   if(m< 16)
   {
       QMessageBox::information(NULL, "提示", "第3块输入数据不足!");
       ui- >lineEdit_5->setFocus();
       return;
   }

   QLibrary mylib("OUR_MIFARE.dll");
   if (!mylib.load())                //判断是否正确加载
   {
       QMessageBox::information(NULL, "提示", "动态库没装载!原因是动态库OUR_MIFARE.dll没放在生成exe文件相同目录下!");
       return;
   }
   piccchangesinglekeyex mypiccchangesinglekeyex = (piccchangesinglekeyex)mylib.resolve("piccchangesinglekeyex");
   status = mypiccchangesinglekeyex(ctrlword,serial,area,keyA1B0,piccoldkey,piccdata);
   QMessageBox::warning(this, "警告", "你确定修改密码控制块的数据吗 ?此数据块如果改写错误,数据卡将会被限制", QMessageBox::Ok, QMessageBox::Cancel);
   if(status == 0)
   {
       QMessageBox::information(NULL, "提示", "操作成功,写卡数据有效!");
       pcdbeep mypcdbeep = (pcdbeep)mylib.resolve("pcdbeep");
       if (mypcdbeep == NULL)                   //是否成功连接上 idr_beep()函数
       {
         mylib.unload();
         QMessageBox::information(NULL, "提示", "请检查函数名是否正确!");
         return;

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

   }
   else if(status == 8)
   {
       QMessageBox::information(NULL, "提示", "寻卡错误,根本就没有卡在感应区");

   }
   else if(status == 12)
   {
       QMessageBox::information(NULL, "提示", "密码认证失败");
   }

}

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • IC卡
    +关注

    关注

    2

    文章

    174

    浏览量

    36339
  • Qt
    Qt
    +关注

    关注

    2

    文章

    318

    浏览量

    40299
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RK3506开发QT Creator开发手册,交叉编译工具链与QT应用示例,入门必备

    本文基于触觉智能RK3506核心板/开发板介绍QTCreator交叉编译配置与QT应用示例。如需购买开发板进行评估验证简介QTCreatorQtCreator‌是由TheQtCompany开发
    的头像 发表于 09-30 16:26 3363次阅读
    RK3506<b class='flag-5'>开发</b>板<b class='flag-5'>QT</b> Creator<b class='flag-5'>开发</b>手册,交叉编译工具链与<b class='flag-5'>QT</b>应用示例,入门必备

    创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—Qt工程编译、GPU核心使用说明

    及 Kits 配置;还介绍评估板运行 Qt 程序程序自启动设置,以及通过 textures 案例演示 Qt+OpenGL 调用 GPU
    的头像 发表于 09-29 14:16 369次阅读
    创龙 瑞芯微 RK3588 国产2.4GHz八核 工业<b class='flag-5'>开发</b>板—<b class='flag-5'>Qt</b>工程编译、GPU核心使用说明

    【汇思博SEEK100开发板试用体验】在开发板鸿蒙OS搭建QT开发环境

    应用所需的功能逻辑。比如与开发板的硬件功能进行交互,若要调用开发板的摄像头功能,可通过相关的 Qt 多媒体结合鸿蒙系统提供的摄像头接口进行
    发表于 08-24 18:34

    EtherCAT运动控制应用开发教程之Java

    运动控制的Java开发及DLL调用
    的头像 发表于 06-13 14:29 622次阅读
    EtherCAT运动控制<b class='flag-5'>卡</b>应用<b class='flag-5'>开发</b>教程之Java

    基于RK3576开发板的QT GUI例程

    EASYEAI Orin-Nano开发板搭载了带有xfce桌面环境的Debian系统,支持Qt应用程序开发和运行。开发板采用RK3576
    的头像 发表于 05-14 10:26 1224次阅读
    基于RK3576<b class='flag-5'>开发</b>板的<b class='flag-5'>QT</b> GUI例程

    EtherCAT运动控制器实时数据的Qt示波器

    基于QT开发调用正运动函数接口实现控制器数据实时监测的示波器效果
    的头像 发表于 04-17 17:12 572次阅读
    EtherCAT运动控制器实时数据的<b class='flag-5'>Qt</b>示波器

    【技术案例】Qt 环境部署 - Ubuntu 篇

    什么是QtQt是一个跨平台C++图形用户界面应用程序开发框架,可构建高性能的桌面、移动及Web应用程序,也可用于
    的头像 发表于 04-16 17:17 1440次阅读
    【技术案例】<b class='flag-5'>Qt</b> 环境部署 - Ubuntu 篇

    请问可以直接参考DLP4500软件源码的调用方式进行控制吗?需要添加哪些文件吗?

    软件源码的调用方式进行控制吗?需要添加哪些文件吗? 2. 在论坛中看到有人使用基于MFC进行控制投影的,请问使用MFC和Qt哪个更兼容、开发起来更容易些呢?
    发表于 03-03 08:23

    ElfBoard技术贴|如何在ELF 1开发板上交叉移植Qt

    在嵌入式系统开发领域,针对特定硬件平台进行Qt框架的移植与适配是一项关键技术任务。作为业界主流的跨平台应用开发框架,Qt凭借其完善的图形界面支持能力,在嵌入式
    的头像 发表于 02-24 16:18 1039次阅读
    ElfBoard技术贴|如何在ELF 1<b class='flag-5'>开发</b>板上交叉移植<b class='flag-5'>Qt</b>

    调用读命令CYPRESS_I2C_ReadI2C一直失败的原因?

    我目前用QT开发环境:Qt 5.12 + MSVC2017 64bitRelease)对光机GUI的一些功能进行移植开发,在官网上获取了cyusbserial.dll 的64位
    发表于 02-20 08:04

    Qt Group发布Qt AI Assistant,助力跨平台UI开发

    为了进一步提升跨平台用户界面(UI)开发的效率与便捷性,Qt Group近日推出了一款实验性工具——Qt AI Assistant。这款工具的问世,标志着Qt Group在简化UI
    的头像 发表于 02-07 13:47 1645次阅读

    基于QT开发国产主板终端桌面程序 高效、稳定、跨平台的解决方案

    开发者们面临的一个重要挑战。本文将介绍如何基于QT框架,开发适用于国产主板的终端桌面程序,并探讨其优势和应用场景。 QT是一个跨平台的C+
    的头像 发表于 01-08 15:34 1442次阅读

    USB免驱全协议IC读写QT程序开发

      读取15693IC读卡器如下入所示: 15693卡片,通常指的是符合ISO/IEC 15693标准的非接触式智能或RFID。以下是对15693卡片的详细介绍: 一、基本概述
    的头像 发表于 12-30 17:42 895次阅读
    USB免驱全协议<b class='flag-5'>IC</b><b class='flag-5'>卡</b><b class='flag-5'>读写</b>器 <b class='flag-5'>QT</b><b class='flag-5'>程序</b><b class='flag-5'>开发</b>

    C++ QT开发IC读写程序

    第一步:新建一个qt C++项目 在此需要注意, 名称和路径不能有中文。 第二步: 添加控件 完成UI布局 IC读写读写IC
    的头像 发表于 12-30 14:55 1075次阅读
    C++ <b class='flag-5'>QT</b><b class='flag-5'>开发</b>,<b class='flag-5'>IC</b><b class='flag-5'>读写</b>器<b class='flag-5'>程序</b>

    QT调用动态

    \", \"动态没装载!原因是动态OUR_IDR.dll没放在生成exe文件相同目录下!\"); return; } idr_beep myidr_beep
    发表于 12-28 16:19