您的位置:首页 > 编程语言 > Qt开发

Qt隐式、显式调用DLL

2018-01-19 22:40 337 查看
下面是我对Qt隐式/显式调用DLL一点理解,我参考的相关网址会在下面罗列出来:

①显示调用

这里我觉得http://www.cnblogs.com/newstart/archive/2013/01/23/2873611.html的例子挺好的,使用Qt创建了一个加法函数和查询页面并封装成DLL以供Qt调用。

头文件里申明DLL共享接口:

[cpp] view
plain copy

#include "MyTestDll_global.h"  

#include "qdialog.h"  

[cpp] view
plain copy

extern "C++" Q_DECL_EXPORT int add(int a,int b);  

extern "C++" Q_DECL_EXPORT QDialog *showDialog();  

源文件里添加DLL共享接口:

[cpp] view
plain copy

int add(int a,int b)  

{  

  return a+b;  

}  

QDialog *showDialog()  

{  

    MyShowTest *ss=new MyShowTest();  

    return ss;  

}  

生成后将DLL置于需要调用该DLL的工程的输出目录中,调用DLL程序部分如下:

[cpp] view
plain copy

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

int result;  

QString sresult;  

if (mylib.load())              //判断是否正确加载  

{  

    Fun open=(Fun)mylib.resolve("add");    //援引 add() 函数  

    if (open)                  //是否成功连接上 add() 函数  

    {  

         int s1=this->ui->lineEdit->text().toInt();  

         int s2=this->ui->lineEdit_2->text().toInt();  

         result=open(s1,s2);      //这里函数指针调用dll中的 add() 函数  

         sresult=QString::number(result);  

         this->ui->lineEdit_3->setText(sresult);  

    }  

}  

else  

{  

    QMessageBox::information(NULL,"NO","DLL is not loaded!");  

}  

注意须添加qlibrary.h 。
http://blog.csdn.net/derryzhang/article/details/4653708这里用VS搭配Qt写了一个DLL文件,然后Qt调用该DLL。其特别之处在于,用VS搭配Qt写DLL时用到了模块定义文件。
②隐式调用

参考http://www.cnblogs.com/hicjiajia/archive/2010/08/27/1810239.html

[cpp] view
plain copy

LIBS+= -LD:/qt/MyTest_2 -lMyTestDll  

注: 1、-L 参数指定 .lib/.a 文件的位置
        2、-l  参数指定导入库文件名(不要加扩展名)
        3、另外,导入库文件的路径中,反斜杠用的是向右倾斜的
        4、Qt要隐式调用DLL的话,须把dll文件放在程序的输出目录中,lib所存放的文件路径随便,但是须由上述.pro文件中的LIBS指定语句指定其所在文件夹,.h文件放在程序当前目录下即可。

调用DLL程序部分如下:

[cpp] view
plain copy

extern "C++"  

{  

#include "mytestdll.h"  

}  

int main(int argc ,char **argv)  

{  

    QApplication app(argc,argv);  

    qDebug()<<add(5,6);    // dll 中的一个加法函数  

    QDialog *d=showDialog();  

    d->show();  

    return app.exec();  //完成使命后,直接退出,不让它进入事件循环  

}  

总的说一句:

显式调用:需要在程序里使用语句将DLL导入,打开共享库,使用后再关闭。

隐式调用:不需要使用语句导入,直接调用即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: