当前位置: 首页 > news >正文

VC2010中 调用DLL的方法

调用DLL有两种方法:静态调用和动态调用.

(一).静态调用其步骤如下:

1.把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下;

2.把你的youApp.lib拷到你目标工程(需调用youApp.DLL的工程)目录下;

3.把你的youApp.h(包含输出函数的定义)拷到你目标工程(需调用youApp.DLL的工程)目

录下;

4.打开你的目标工程选中工程,选择Visual C++的Project主菜单的Settings菜单;

5.执行第4步后,VC将会弹出一个对话框,在对话框的多页显示控件中选择Link页。然

后在Object/library modules输入框中输入:youApp.lib

6.选择你的目标工程Head Files加入:youApp.h文件;

7.最后在你目标工程(*.cpp,需要调用DLL中的函数)中包含你的:#include "youApp.h"

注:youApp是你DLL的工程名。

2.动态调用其程序如下:

动态调用时只需做静态调用步骤1.

{

HINSTANCE hDllInst = LoadLibrary("youApp.DLL");

if(hDllInst)

{

typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);

MYFUNC youFuntionNameAlias = NULL; // youFuntionNameAlias 函数别名

youFuntionNameAlias = (MYFUNC)GetProcAddress

(hDllInst,"youFuntionName");

// youFuntionName 在DLL中声明的函数名

if(youFuntionNameAlias)

{

youFuntionNameAlias(param1,param2);

}

FreeLibrary(hDllInst);

}

}

显式(静态)调用:

LIB + DLL + .H,注意.H中dllexport改为dllimport

隐式(动态)调用:

DLL + 函数原型声明,先LoadLibrary,再GetProcAddress(即找到DLL中函数的地址),不用后FreeLibrary


C++ 调用.lib的方法:

一: 隐式的加载时链接,有三种方法

1 LIB文件直接加入到工程文件列表中

  在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入DLL的LIB文件。然后在首先要使用该函数的地方加上该LIB的头文件,如#include "..\lib.h"即可(没有头文件当然就不用了)。

  2 设置工程的 Project Settings来加载DLL的LIB文件

  打开工程的 Project Settings菜单,选中Link,然后在Object/library modules下的文本框中输入DLL的LIB文件,如you.lib(或者lib文件的路径,包括文件名)。然后在首先要使用该函数的地方加上该LIB的头文件,如#include "..\lib.h"即可(没有头文件当然就不用了)。

  3 通过程序代码的方式

  加入预编译指令#pragma comment (lib,"*.lib"),这种方法优点是可以利用条件预编译指令链接不同版本的LIB文件。因为,在Debug方式下,产生的LIB文件是Debug版本,如Regd.lib;在Release方式下,产生的LIB文件是Release版本,如Regr.lib。然后在首先要使用该函数的地方加上该LIB的头文件,如#include "..\lib.h"即可(没有头文件当然就不用了)。

当应用程序对DLL的LIB文件加载后,还需要把DLL对应的头文件(*.h)包含到其中,在这个头文件中给出了DLL中定义的函数原型,然后声明

二, 显式的运行时链接 ,(我用的是此方法)
隐式链接虽然实现较简单,但除了必须的*.dll文件外还需要DLL的*.h文件和*.lib文件,在那些只提供*.dll文件的场合就无法使用,而只能采用显式链接的方式。这种方式通过调用API函数来完成对DLL的加载与卸载,能更加有效地使用内存,在编写大型应用程序时往往采用此方式。这种方法编程具体实现步骤如下:
①使用Windows API函数Load Library或者MFC提供的AfxLoadLibrary将DLL模块映像到进程的内存空间,对DLL模块进行动态加载。
②使用GetProcAddress函数得到要调用DLL中的函数的指针。
③不用DLL时,用Free Library函数或者AfxFreeLibrary函数从进程的地址空间显式卸载DLL。
例:在应用程序中调用dll文件

——在应用程序中要首先装入dll后才能调用导出表中的函数,例如用mfc

创建基于对话框的工程test,并在对话框上放置"load"按钮,先添加装载代码。
1.首先在testdlg.cpp的首部添加变量设置代码:

//设置全局变量glibsample用于存储dll句柄

HINSTANCE glibsample=null; //如果定义成HANDLE类型,则出错

//第二个变量showme是指向dll
库中showme()函数的指针

typedef int(* Showme)(void);

Showme showme;

2.利用classwizard为"load"按钮添加装载dll的代码

void ctestdlg::onloadbutton()

{

//要添加的代码如下

if(glibsample!=NULL)

{

AfxMessageBox("the sample.dll has already been load.");

return;

}

//装载sample.dll,未加路径,将在三个默认路径中寻找 (1)windows的系统目录:\windows\system;

//(2)dos中path所指出的任何目录;

//(3)程序所在的目录;


glibsample=Loadlibrary("sample.dll");

//返回dll中showme()函数的地址

showme=(Showme)GetProcAddress(glibsample,"showme");




静态链接库LIB和动态链接库DLL的区别


1.什么是静态连接库,什么是动态链接库
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接 库。静态链接库与静态链接库调用规则总体比较如下。

对于静态链接库(比较简单):
首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。

生成库的.h头文件中的声明格式如下:
extern "C" 函数返回类型 函数名(参数表);
在调用程序的.cpp源代码文件中如下:
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")
//指定与静态库一起链接

第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:)

对于动态链接库:
动态链接库的使用需要库的开发者提供生成的.lib文件和.dll文件。或者只提供dll文件。
首先我们必须先注意到DLL内的函数分为两种:
(1)DLL 导出函数,可供应用程序调用;
(2)DLL 内部函数,只能在 DLL 程序使用,应用程序无法调用它们。
因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。



相关文章:

  • Win32_6Win32的验证码程序
  • iOS Xcode, 解决“Could not insert new outlet connection”的问题。
  • Win32_7由浅入深——滚动条
  • 简单实现web服务器负载均衡
  • Android编程之ActivityManager: Segmentation fault
  • C# 网络编程之网页简单下载实现
  • mac 下对 iterm 终端 设置代理
  • 如何理解c和c++的复杂类型声明
  • silverlight中datagrid数据到处excel
  • Android编程之如何取得View的当前位置
  • Android4.0内存Dex数据动态加载技术
  • C# 网络编程之网页自动登录 (一).使用WebBrower控件模仿登录
  • 文章收录1
  • windows服务器应对高并发和DDOS攻击
  • 公开课可下载资源汇总
  • 【翻译】babel对TC39装饰器草案的实现
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • CSS实用技巧
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • JS实现简单的MVC模式开发小游戏
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • tab.js分享及浏览器兼容性问题汇总
  • 构建二叉树进行数值数组的去重及优化
  • 简单实现一个textarea自适应高度
  • 盘点那些不知名却常用的 Git 操作
  • 前端
  • 微信开放平台全网发布【失败】的几点排查方法
  • 一份游戏开发学习路线
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • Nginx实现动静分离
  • # 透过事物看本质的能力怎么培养?
  • #define,static,const,三种常量的区别
  • #Lua:Lua调用C++生成的DLL库
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • $ git push -u origin master 推送到远程库出错
  • %@ page import=%的用法
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (42)STM32——LCD显示屏实验笔记
  • (C#)一个最简单的链表类
  • (C语言)二分查找 超详细
  • (poj1.2.1)1970(筛选法模拟)
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (十八)SpringBoot之发送QQ邮件
  • (算法)Game
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .net项目IIS、VS 附加进程调试
  • .NET性能优化(文摘)
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • [2016.7.Test1] T1 三进制异或
  • [383] 赎金信 js