• 11682阅读
  • 5回复

qt下加载usb的DLL文件 [复制链接]

上一主题 下一主题
离线songfangfang
 
只看楼主 倒序阅读 楼主  发表于: 2010-04-07
这两天在搞USB的东西,实现pc机与单片机的数据传输,但qt下没有 usb的类,所以只好调用CH375的API函数,文件(ch375.dll,ch375.lib,ch375.h),
也查了不少资料,但都说的很模糊,今天终于在qt下成功的调用了API函数,把步骤贴出来,希望给大家点帮助,有不对的还望大家指教,
这个是我的第一个帖子,呵呵,以后会继续分享~~~
第一步:新建QT4 GUI Application工程,工程名为usbtest,我的路径名为E:/qtwork/usbtest
第二步:把下载的ch375.dll和ch375.lib文件拷贝到E:/qtwork/usbtest/debug目录下,ch375.H的拷贝到E:/qtwork/usbtest下
第三步:在ch375.h的文件中包含头文件 #include "qt_windows.h"  //重要
第四步:在MainWindow.CPP中包含头文件 #include “ch375.h”和#include <QLibrary>
第五步:在usbtest.pro文件中加入 LIBS += -LE:/qtwork/usbtest/debug/ -lch375
基本完成,现在就可以实现函数的调用了,我用的是显式的方式调用API函数的,
在MainWindow.CPP加入以下函数:
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QLibrary lib("E:/qtwork/usbtest/debug/CH375.DLL");                    //加载DLL文件

    if(lib.load())                                                                                       //如果加载成功
    {
        typedef HANDLE(*OpenDevice)(ULONG iIndex);                    //显示调用CH375中的函数
        OpenDevice open=(OpenDevice)lib.resolve("CH375OpenDevice");
        HANDLE u = open(1);
        qDebug()<<u;
        qDebug()<<"CH375.DLL LOAD SUCCESS!";
    }
    else
        qDebug()<<"CH375.DLL LOAD UNSUCCESS!";
}
编译运行后就可以先到如下的调试信息:
E:\qtwork\usb\debug\usb.exe exited with code 0

Starting E:\qtwork\usb\debug\usb.exe...
0xffffffff
CH375.DLL LOAD SUCCESS!
离线wxj120bw

只看该作者 1楼 发表于: 2010-07-07
竟然没有人来顶 可惜了阿
离线minghu
只看该作者 2楼 发表于: 2010-07-21
楼主厉害,我最近也是用QT调用C++写的DLL文件,同时也是三个文件(add.dll,add.lib,add.h)我按照你的步骤做怎么还是不能调用add函数呢,加载add.dll是成功的,就是里面的函数调用不出来,应该怎么办呢,楼主有办法么,期待指点。。。
离线minghu
只看该作者 3楼 发表于: 2010-07-21
.h头文件里面为什么要加#include "qt_windows.h"呢?

^_^
离线dbzhang800

只看该作者 4楼 发表于: 2010-07-21
引用第3楼minghu于2010-07-21 08:47发表的  :
.h头文件里面为什么要加#include "qt_windows.h"呢?
^_^


1. 因为这是楼主不停地试,试出来来的办法。(不过绕了个大弯)

首先,DLL有显式和隐式加载两种方式。

当 .h 和 .lib 存在时,直接隐式加载 dll 就行了,这是最简单的方法。在pro 文件内指定 INCLUDEPATH 和 LIBS 即可。

当 .h 和 lib 不存在时,只能显示用 QLibrary 来显式加载 dll 了,然后从中解析出函数

针对楼主的问题,首先没必要用 QLibrary,其次若使用QLibrary,不需要 这个.h 文件,但楼主用了  HANDLE、ULONG这种东西,所以需要windows的头文件。直接包含 qt_windows.h 就行了(楼主的做法是把 qt_windows.h 包含进它的 .h ,然后把 .h 又包含进 工程,绕了个弯)
离线luodanoo

只看该作者 5楼 发表于: 2015-06-03
回 dbzhang800 的帖子
dbzhang800:1. 因为这是楼主不停地试,试出来来的办法。(不过绕了个大弯)
首先,DLL有显式和隐式加载两种方式。
....... (2010-07-21 10:13) 

版主你好!我最近在学习QT在windows下hid usb的开发,遇到一个问题 想请教你。调用C:\Qt\Qt5.4.0\Tools\mingw491_32\i686-w64-mingw32\include下面的一个hidsdi.h头文件中的HidD_GetAttributes和HidD_GetHidGuid两个函数,编译出错提示undefined reference to `_imp__HidD_GetHidGuid@4'和 undefined reference to `_imp__HidD_GetAttributes@8'。这会是什么原因?
快速回复
限100 字节
 
上一个 下一个