QT5开发笔记(十一)--USB相关


注册插拔事件: 基于WinAPI编程都差不多

GUID HidGuid ={ 0x4D1E55B2, 0xF16F, 0x11CF,{0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30}};
DEV_BROADCAST_DEVICEINTERFACE DevInterface;
ZeroMemory(&DevInterface,sizeof(DEV_BROADCAST_DEVICEINTERFACE));
DevInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
DevInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
DevInterface.dbcc_classguid = HidGuid;
RegisterDeviceNotification((HANDLE)this->winId(),&DevInterface,DEVICE_NOTIFY_WINDOW_HANDLE);

重载nativeEvent函数:

bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
    MSG* msg = reinterpret_cast<MSG*>(message);
    int msgType = msg->message;
    (void)eventType;
    (void)result;
    if(msgType==WM_DEVICECHANGE)
    {
        // 设备变化
        PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;
        switch (msg->wParam) {
        case DBT_DEVICEARRIVAL:

            if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
            {
                PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
                if(lpdbv->dbcv_flags ==0)
                {
                    //插入u盘
                    //QString USBDisk = QString(this->FirstDriveFromMask(lpdbv ->dbcv_unitmask));
                    //qDebug() << "USB_Arrived and The USBDisk is: "<<USBDisk ;
                    ui->textBrowser->append("USB_Arrived and The USBDisk is");

                }
            }
            else if(lpdb->dbch_devicetype = DBT_DEVTYP_DEVICEINTERFACE)
            {
            }
            else
            {

            }
            break;

        case DBT_DEVICEREMOVECOMPLETE:
            if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
            {
            }
            else if(lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
            {
               //PDEV_BROADCAST_DEVICEINTERFACE pDevInf  = (PDEV_BROADCAST_DEVICEINTERFACE)lpdb;
               //QString strname = QString::fromWCharArray(pDevInf->dbcc_name,pDevInf->dbcc_size);
               ui->textBrowser->append("移除设备 ");
            }
            else
            {
            }
            break;
    }
    return false;
}

- 阅读全文 -

QT5开发笔记(九)--线程


新建基于QThread的类:

#include <QString>
#include <QThread>

class MyThread : public QThread
{
public:
    MyThread(QString s);
private:
    QString name;
protected:
    void run();
};

重载run函数:

void MyThread::run()
{
    int i = 0;
    while(1)
    {
        qDebug()<<name.toStdString().c_str()<<":"<<i++;
        sleep(1);    // 线程休眠
    }
}

创建线程:

MyThread *t1 = new MyThread("ThreadA");
MyThread *t2 = new MyThread("ThreadB");

线程启动:

t1->start();                                     // 默认优先级InheritPriority
t2->start(QThread::Priority::NormalPriority);    // 指定优先级

线程终止:

t1->terminate();

线程信号:

void started(QPrivateSignal);
void finished(QPrivateSignal);
connect(t1, SIGNAL(started()),  this, SLOT(on_thread_started()));
connect(t1, SIGNAL(finished()), this, SLOT(on_thread_finished()));

线程休眠: 由线程自己调用,不建议在主程序中调用(否则调用程序会阻塞)

sleep(5);        // 单位为秒
msleep(500);     // 毫秒级休眠
usleep(10000);   // 微秒级休眠

- 阅读全文 -

QT5开发笔记(八)--静态/动态链接库调用


显示调用动态库

#include <QLibrary>

// 定义函数指针
typedef char* (*pcfun)(void);

QLibrary dll("usbrd32.dll");   // 声明所用到的dll文件

// 加载动态库
if (dll.load())
{
    ui->textBrowser->append("load successful");
}
else
{
    ui->textBrowser->append("load failed");
}

// 通过函数名称载入函数
pcfun file_info =(pcfun)dll.resolve("file_info");
if (file_info)
{
     file_info();    // 执行函数
}
else
{
    ui->textBrowser->append("resolve failed");
}

显式调用仅需要usbrd32.dll一个文件复制到生成目录中即可;
显式调用需要显式的导出每个函数,使用起来太麻烦,所以还是用隐式调用。


动态链接库隐式调用: 隐式调用需要h文件及lib文件

将usbrd32.lib,usbrd32.h文件复制到工程源文件目录中;

将usbrd32.dll文件复制到生成目录;

修改工程文件(.pro),添加一行

# -l指定的库不带lib扩展名
# -L指定lib文件所在的目录
LIBS+= -L E:\code\qt\HelloWorld -lusbrd32

直接调用即可:

dll_version();

注意事项:

软件发布时,不会自动复制用户的dll文件,需要手动复制至发布目录中;
lib文件与VC格式相同,VC编译时自动生成的就可以直接用(与C++Builder不同);
头文件里要用extern "C"{}圈起来(也可以在文件中圈)


从动态链接库里导出lib文件: 需要VS支持(VS6)

导出函数列表:

dumpbin /exports usbrd32.dll > usbrd32.def

内容如下:

Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.  

Dump of file usbrd32.dll

File Type: DLL

  Section contains the following exports for usbrd32.dll

           0 characteristics
    54D07173 time date stamp Tue Feb 03 14:57:55 2015
        0.00 version
           1 ordinal base
          61 number of functions
          61 number of names

    ordinal hint RVA      name

          1    0 00002720 active_card
          2    1 00001FE0 close_device
          3    2 00002230 connect_device
          此处省略干行 ......................

Summary

        3000 .data
        2000 .rdata
        1000 .reloc
        7000 .text

修改def文件如下:(建议用脚本修改)

LIBRARY export

EXPORTS
active_card        @1
close_device       @2
connect_device     @3

通过def文件生成lib文件:仅用于动态链接库的隐式调用

lib /def:usbrd32.def /machine:i386 /out:usbrd32.lib

- 阅读全文 -


Copyright©2025 春天花会开, All Rights Reserved. Email: webmaster@oroct.com