QT调用动态链接库实例

原创 2013年12月02日 15:44:06

一、动态链接库调用方式

1、动态调用 Run-time Dynamic Linking

动态调用主要通过API函数(Window LoadLibrary、GetProcAddress、FressLibrary)来调用程序运行后需要的DLL函数,节省内存空间。QT中,则主要通过QLibrary进行动态加载(适用于跨平台)。

2、静态调用 Load-time Dynamic Linking

静态调用前提是在编译之前已经明确知道调用DLL中的哪些函数,需要lib和相应的导入头文件*.h。编译时,在目标文件中只保留必要的链接信息,而不含DLL函数的代码;当程序执行时,利用链接信息加载DLL函数代码并在内存中将其连接入调用程序的执行空间中,其主要目的是便于代码共享。

二、QT 5.0调用CVI生成的动态链接库实例

1、CVI生成动态链接库

CVI是个很强大的开发工具
创建过程参考
http://wenku.baidu.com/link?url=hvST1qn3UTjIYvLimf2cSDovK5YCagHU--WjRKOqXlYplBV-MXEGS-jqikiZlnRTNh3GM4efyFy_GSqGC26QMZWN5UUBkUSmeV3uJPXrBj3
代码dll1.h和dll1.c
#ifndef __dll1_H__
#define __dll1_H__

#include "cvidef.h"
int __stdcall Add(int, int);

#endif  /* ndef __dll1_H__ */






#include <cvirte.h>
#include "dll1.h"

int __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
	switch (fdwReason)
	{
		case DLL_PROCESS_ATTACH:
			if (InitCVIRTE (hinstDLL, 0, 0) == 0)
				return 0;	  /* out of memory */
			break;
		case DLL_PROCESS_DETACH:
			CloseCVIRTE ();
			break;
	}
	
	return 1;
}

int __stdcall DllEntryPoint (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
	/* Included for compatibility with Borland */

	return DllMain (hinstDLL, fdwReason, lpvReserved);
}

/*extern "C" */int __stdcall Add(int x, int y)
{
	return x+y;
}


2、QT动态链接库的调用

2.1 动态调用

#include "mydlg.h"
#include "ui_mydlg.h"
#include "qmessagebox.h"
#include <QLibrary>

MyDlg::MyDlg(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MyDlg)
{
    ui->setupUi(this);

}

MyDlg::~MyDlg()
{
    delete ui;
}

void MyDlg::on_pushButton_clicked()
{
     int a = 10;
     int b = 11;
     int c = 0;
     typedef int (*myfun)(int ,int);
     QLibrary hdll("dll1.dll");
     if(hdll.load())
     {
         QMessageBox::about(this, "Msg","Load Success!");
         myfun fun1 = (myfun)hdll.resolve("Add");
         if(fun1)
         {
             c = fun1(a, b);
             QString result_msg = tr("dll加载成功!")+QString::number(c,10);
             QMessageBox::about(this, "Result", "The Sum is "+result_msg);

         }
         hdll.unload();
     }
}




2.2 静态调用

参考http://hi.baidu.com/ayuyuan/item/756788382b4c95573075a1c6
在XX.pro中添加: LIBS += ./debug/dll1.lib
创建并添加头文件:dll2.h

//dll2.h
#ifndef DLL2_H
#define DLL2_H
//#pragma comment(lib, "dll1.lib")

extern "C" __declspec(dllimport) int __stdcall Add(int, int);
#endif // DLL1_H







//myDlg.cpp中直接使用DLL函数
void MyDlg::on_pushButton_clicked()
{
     int a = 10;
     int b = 11;
     int c = 0;

     c = Add(a, b);
     QString result_msg = tr("dll加载成功!")+QString::number(c,10);
     QMessageBox::about(this, "Result", "The Sum is "+result_msg);

}




QT Creator 如何建立动态链接库和使用的方法(详细的图文教程以及错误的讲解)

error: LNK1107: 文件无效或损坏: 无法在 0x378 处读取 :-1: error: LNK1104: 无法打开文件“addlib.dll”...
  • qq_34837137
  • qq_34837137
  • 2016年08月22日 15:47
  • 6353

qt使用动态库(DLL)

本文主要讲解在QT开发环境中如何使用VC生成的DLL及QT自身生成的DLL。至于其它情况本文不作讨论。 连接库分为2种 (1)动态连接库,通常有.h .lib .dll三个文件,功能实现在dll中 ...
  • zhuce0001
  • zhuce0001
  • 2014年03月06日 20:44
  • 35233

Qt加载动态链接库

Qt加载动态链接库 先制作个简单的动态链接库,再在Qt里面加载它。 【制作动态链接库】 先编写一个hello.c 1 #include 2 int hello() 3 {...
  • tommyblue
  • tommyblue
  • 2012年12月13日 15:08
  • 5297

Qt创建和使用动态链接库

一、创建共享库 1、新其他建项目,选择C++库 2、选择共享库,并取项目名称,单击下一步。这里取名位mylib 3、按默认配置单击下一步至模块选项,选择所需支持的...
  • q496713258
  • q496713258
  • 2011年11月19日 13:54
  • 8974

Qt加载动态链接库

先制作个简单的动态链接库,再在Qt里面加载它。 【制作动态链接库】 先编写一个hello.c 1 #include 2 int hello() 3 { 4 printf("hell...
  • dongpanshan
  • dongpanshan
  • 2013年02月21日 10:36
  • 914

Linux下使用QT编写和调用动态链接库(.so文件)

Linux下Qt创建和调用共享库文件.so 费了点功夫,总算get了编写共享库(Shared Library,Windows下称为“动态链接库”,即Dynamic Link Library)...
  • lywzgzl
  • lywzgzl
  • 2015年01月17日 16:06
  • 10417

QT编写和调用dll动态库最新版(隐式调用)

网上也有不少教程,但是很多都是只讲述了如何做,没有说为什么,导致很多迷惑,当然包括我。今天仔细尝试了,现在把结果说出来,大家共同学习。 首先我们来创建一个简单的dll,实现两个数相加。 1.首先是新建...
  • xuancailinggan
  • xuancailinggan
  • 2016年07月10日 23:02
  • 6362

qt和VS动态库调用心得

1 动态库调用 1.1 QT动态库调用 1.1.1 创建一个动态链接库步骤 1)create C++类库 2).pro文件里增加路径DESTDIR= ..\MyDebug 3)编译 注:主要的不同,两...
  • u013359794
  • u013359794
  • 2016年06月02日 17:21
  • 2803

Qt程序中动态库的隐式调用

这几天在写程序中时候,用到了一个第三方库。我下载完他的源码编译后,不怎么怎么使用, 后来在网上找了找了一些资料查看了一些文档。终于解决了问题! 动态库和静态库的介绍在在前的博客:http://bl...
  • Andy_93
  • Andy_93
  • 2016年10月20日 14:43
  • 968

QT调用动态库的方法

平台:PXA270 + linux           工具:编程qtcreator           交叉编译器:ARM-LINUX-GCC          目前编程方式是使用qtcrea...
  • h32dong809
  • h32dong809
  • 2012年05月16日 20:21
  • 4456
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QT调用动态链接库实例
举报原因:
原因补充:

(最多只允许输入30个字)