Chinaunix首页 | 论坛 | 博客
  • 博客访问: 141105
  • 博文数量: 35
  • 博客积分: 245
  • 博客等级: 二等列兵
  • 技术积分: 320
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-06 14:31
文章分类

全部博文(35)

文章存档

2017年(8)

2015年(1)

2014年(7)

2013年(11)

2012年(1)

2011年(7)

我的朋友

分类: C/C++

2011-11-21 13:28:23

http://blog.csdn.net/derryzhang/article/details/4653708

这些天在做一个工程,要用到Qt,所以特别研究了一下Qt显式调用链接库的问题。隐式调用就不那么想用了,个人感觉隐式调用既浪费内存,造成程序启动速度极慢,又容易造成链接错误(本人在ogre中深受链接错误之苦),所以只用了显式调用。以前只试过在MFC中显式调用dll,在Qt上还没试过。其实细细研究一下,相对于MFC的调用来说,Qt的调用也是大同小异的。在这里分享一下。

 首先用VS写一个dll先(名字为QtDllTest)。写dll最大的问题就是解决导出函数重命名问题。其中解决方法是多种多样的。本人只用自己最常用一种——用模块定义文件.def。
 第一步,写一个dll,简单写一个测试加法函数的:
  int add(int a,int b)
  {
       return a+b;
   }
之后添加一个模块定义文件QtDllTest.def:
LIBRARY "QtDllTest"
EXPORTS
add



之后顺利生成dll.
现在可以利用dll函数导出工具DLL Export Viewer查看刚才生成的dll中的导出函数:


发现,导出函数名字没有乱码,说明导出函数正常。
现在,就以这个dll为例来试着用Qt调用。
新建一个名为QtDllTestDemo的Qt Application:

默认,下一步

继续下一步:

Finish就行了。反正一切默认就行。
在ui界面中加入一个pushButton(ObjectName:CalButton,Text:Calculate),一个Label控件(Text:Result),一个lineEdit控件(ObjectName:Result),主要是在点击按钮后调用dll并计算把计算结果显示在文本框中,如下图所示:

为了顺利使用dll,我们要在qtdlltestdemo.cpp开始包含这个东西:#include
下面给pushButton添加click响应事件:
void QtDllTestDemo::on_CalButton_clicked()
{
 QLibrary lib("QtDllTest.dll");
 if (lib.load())
 {
  typedef int(*AddFunction)(int a,int b);
  AddFunction Add=(AddFunction)lib.resolve("add");
  if (!Add)
  {
   ui.Result->setText("Failed!");
  }
  else
  {
   int m;
   m=Add(1,1); //来个计算1+1
   QString str=QString("%1").arg(m);
   ui.Result->setText(str);
  }
 }
 else
 {
  ui.Result->setText("Failed!");
 }
}
之后生成程序,复制在开始生成的dll文件到QtDllTestDemo的Debug或者Release目录中运行,点击“Calculate"按钮,发现已经成功调用:


其实和MFC的调用也就差那么一两句话,真可谓大同小异。导出类中函数亦如此。

阅读(1197) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:lib和dll文件的区别和联系

给主人留下些什么吧!~~