QT隐式调用动态链接库(转)

下面是我对Qt隐式/显式调用DLL一点理解,我参考的相关网址会在下面罗列出来:


①显示调用

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

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

  1. #include "MyTestDll_global.h"  
  2. #include "qdialog.h"  

  1. extern "C++" Q_DECL_EXPORT int add(int a,int b);  
  2. extern "C++" Q_DECL_EXPORT QDialog *showDialog();  

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

  1. int add(int a,int b)  
  2. {  
  3.   return a+b;  
  4. }  
  5. QDialog *showDialog()  
  6. {  
  7.     MyShowTest *ss=new MyShowTest();  
  8.     return ss;  
  9. }  

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

  1. QLibrary mylib("MyTestDll.dll");   //声明所用到的dll文件  
  2. int result;  
  3. QString sresult;  
  4. if (mylib.load())              //判断是否正确加载  
  5. {  
  6.     Fun open=(Fun)mylib.resolve("add");    //援引 add() 函数  
  7.     if (open)                  //是否成功连接上 add() 函数  
  8.     {  
  9.          int s1=this->ui->lineEdit->text().toInt();  
  10.          int s2=this->ui->lineEdit_2->text().toInt();  
  11.          result=open(s1,s2);      //这里函数指针调用dll中的 add() 函数  
  12.          sresult=QString::number(result);  
  13.          this->ui->lineEdit_3->setText(sresult);  
  14.     }  
  15. }  
  16. else  
  17. {  
  18.     QMessageBox::information(NULL,"NO","DLL is not loaded!");  
  19. }  

注意须添加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

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

调用DLL程序部分如下:

  1. extern "C++"  
  2. {  
  3. #include "mytestdll.h"  
  4. }  
  5. int main(int argc ,char **argv)  
  6. {  
  7.     QApplication app(argc,argv);  
  8.     qDebug()<<add(5,6);    // dll 中的一个加法函数  
  9.     QDialog *d=showDialog();  
  10.     d->show();  
  11.     return app.exec();  //完成使命后,直接退出,不让它进入事件循环  
  12. }  

总的说一句:

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

隐式调用:不需要使用语句导入,直接调用即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值