浅析C/C++中动态链接库的创建和调用

DLL 有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。下面为你介绍C/C++中动态链接库的创建和调用。

动态连接库的创建步骤:

创建Dll有两种方式。

一、创建Non-MFC DLL动态链接库

1、打开File —> New —> Project选项,选择Win32 Dynamic-Link Library —>sample project —>工程名:DllDemo

2、新建一个。h文件DllDemo.h

#ifdef DllDemo_EXPORTS
#define DllAPI __declspec(dllimport)
#else
#define DllAPI __declspec(dllexport)
extern "C" //原样编译
{
  DllAPI int __stdcall Max(int a,int b); //__stdcall使非C/C++语言内能够调用API
}
#endif

3、在DllDemo.cpp文件中导入DllDemo.h文件,并实现Max(int,int)函数

#include "DllDemo.h"
DllAPI int __stdcall Max(int a,int b)
{
   if(a==b)
     return NULL;
   else if(a>b)
     return a;
   else
     return b;
}

4、编译程序生成动态连接库

二、用.def文件创建动态连接库DllDemo.dll

1、删除DllDemo工程中的DllDemo.h文件。

2、在DllDemo.cpp文件头,删除 #include DllDemo.h语句。

3、向该工程中加入一个文本文件,命名为DllDemo.def并写入如下语句:

1.LIBRARY MyDll 
2.EXPORTS 
3.Max@1

4、编译程序生成动态连接库。

动态链接的调用步骤:

一、隐式调用

1、建立DllCnslTest工程

2、将文件DllDemo.dll、DllDemo.lib拷贝到DllCnslTest工程所在的目录

3、在DllCnslTest.h中添加如下语句:

#define DllAPI __declspec(dllimport)
#pragma comment(lib,"DllDemo.lib") //在编辑器link时,链接到DllDemo.lib文件
extern "C"
{
DllAPI int __stdcall Max(int a,int b);
}

4、在DllCnslTest.cpp文件中添加如下语句: #include "DllCnslTest.h"//或者 #include "DllDemo.h"

void main()
{
   int value;
   value = Max(2,9);
   printf("The Max value is %d\n",value);
}

5、编译并生成应用程序DllCnslTest.exe

二、显式调用

1、建立DllWinTest工程。

2、将文件DllDemo.dll拷贝到DllWinTest工程所在的目录或Windows系统目录下。

3、用vc/bin下的Dumpbin.exe的小程序,查看DLL文件(DllDemo.dll)中的函数结构。

4、使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针。

例:

//需要引入头文件 windows.h最好在最前面,否则可能会出错  不需要windef.h 否则会报错
#include <windows.h>
#include <iostream> 
typedef int(__stdcall *lpMax)(int a,int b); //此语句可以放在.h文件中 必须声明为__stdcall类型 否则出错

5、通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄。

例:

HINSTANCE hDll; //声明一个Dll实例文件句柄
hDll = LoadLibrary("DllDemo.dll");//导入DllDemo.dll动态连接库 

6、通过GetProcAddress()函数获取导入到应用程序中的函数指针。

例:

lpMax M;
M = (lpMax)GetProcAddress(hDLL,"Max");
int value;
value = M(2,9);
std::cout<<value<<std::endl; 

注:上述代码中 Max = (lpMax)GetProcAddress(hDLL,"Max"); 其中参数”Max"为函数名称,可能无法找到(可能和未使用模块定义文件有关)。此时,可用两种方法解决

1、利用vs自带的命令行工具,查看函数的正确名称,首先cd 到bin目录(vc/bin),利用的是vs自带的dumpbin.exe工具。进入bin目录之后,输入命令dumpbin /exports d:\路径\xxx.dll,查看函数的输出名称。通常为_FunctionName@数字,此例中的名称为_Max@8.

2、根据函数在dll(生成dll的头文件中的顺序),例如 Max = (lpMax)GetProcAddress(hDLL,(LCPSTR)MAKEINTRESOURCE(1)); \\找到第一个函数

7、函数调用完毕后,使用FreeLibrary()卸载DLL文件。

FreeLibrary(hDll);

8、编译并生成应用程序DllWinTest.exe

注:显式链接应用程序编译时不需要使用相应的Lib文件。

动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。希望通过本文的分析,你会对此有了解。

以上这篇浅析C/C++中动态链接库的创建和调用就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C++ 中动态链接库--导入和导出的实例详解

    C++ 中动态链接库--导入和导出的实例详解 __declspec(dllexport)和__declspec(dllimport): __declspec(dllexport):编译器看到一个变量.函数或者C++类被它修饰,那么它就知道应该在生成的DLL 模块中导出该变量.函数或C++类. __declspec(dllimport):编译器看到一个变量.函数或者C++类被它修饰,那么它就知道可执行文件或DLL的源文件需要从其它DLL模块中导入一些变量和函数. DLL的导入段: 构建可执行模块时

  • PHP中调用C/C++制作的动态链接库的教程

    一般而言,php速度已经比较快,但是,对于一些较高级开发者而言,如果想要追求更快的速度,那毫无疑问可以通过自己写c代码,并编译为动态链接库(常为.so文件),然后php通过创建一个新的扩展(extension),并在扩展里调用该.so文件,同时对外暴露出php函数接口. 在实际使用中,只要调用该函数接口,即可使用底层更快速的c函数服务. 一.动态链接库(shared) 动态链接库的文件名后缀通常是 ".so".在Windows系统中,其文件名后缀是".dll". 程

  • 在C语言中调用C++做的动态链接库

    今天在做东西的时候遇到一个问题,就是如何在C语言中调用C++做的动态链接库so文件 如果你有一个c++做的动态链接库.so文件,而你只有一些相关类的声明, 那么你如何用c调用呢,别着急,本文通过一个小小的例子,让你能够很爽的搞定. 链接库头文件: head.h class A { public: A(); virtual ~A(); int gt(); int pt(); private: int s; }; firstso.cpp #include <iostream> #include &

  • 详解C++的JSON静态链接库JsonCpp的使用方法

    JsonCpp部署方法: 在http://sourceforge.net/projects/jsoncpp/中下载最新版本的jsoncpp库源码. 之后将jsoncpp-src-版本号-tar.gz解压出来,打开makefiles中的jsoncpp.sln进行编译,之后build文件夹下的vs71\debug\lib_json中会有一个.lib静态链接库. JsonCpp主要包含三种类型的class:Value Reader Writer. jsoncpp中所有对象.类名都在namespace

  • Python 调用VC++的动态链接库(DLL)

    1. 首先VC++的DLL的导出函数定义成标准C的导出函数: 复制代码 代码如下: #ifdef LRDLLTEST_EXPORTS #define LRDLLTEST_API __declspec(dllexport) #else #define LRDLLTEST_API __declspec(dllimport) #endif extern "C" LRDLLTEST_API int Sum(int a , int b); extern "C" LRDLLTE

  • Python调用C/C++动态链接库的方法详解

    本文以实例讲解了Python调用C/C++ DLL动态链接库的方法,具体示例如下: 示例一: 首先,在创建一个DLL工程(本例创建环境为VS 2005),头文件: //hello.h #ifdef EXPORT_HELLO_DLL #define HELLO_API __declspec(dllexport) #else #define HELLO_API __declspec(dllimport) #endif extern "C" { HELLO_API int IntAdd(in

  • 在Visual Studio中用C++语言创建DLL动态链接库图文教程

    什么是DLL(动态链接库)? DLL是一个包含可由多个程序同时使用的代码和数据的库.例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数.因此,每个程序都可以使用该DLL中包含的功能来实现"打开"对话框.这有助于促进代码重用和内存的有效使用.这篇文章的目的就是让你一次性就能了解和掌握DLL. 为什么要使用DLL(动态链接库)? 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可以将它构造成相对独立的功能模块并在之后的项目中重复

  • C++编写DLL动态链接库的步骤与实现方法

    本文实例讲述了C++编写DLL动态链接库的步骤与实现方法.分享给大家供大家参考,具体如下: 在写C++程序时,时常需要将一个class写成DLL,供客户端程序调用.这样的DLL可以导出整个class,也可以导出这个class的某个方法. 一.导出整个class 方法很简单,只需要在类的头文件中class和类名之间加上_declspec(dllexport),同时在另外一份提供给客户端调用程序使用的类的头文件中class和类名之间加上_declspec(dllimport).为了能让客户端程序和D

  • 浅析C/C++中动态链接库的创建和调用

    DLL 有助于共享数据和资源.多个应用程序可同时访问内存中单个DLL 副本的内容.DLL 是一个包含可由多个程序同时使用的代码和数据的库.下面为你介绍C/C++中动态链接库的创建和调用. 动态连接库的创建步骤: 创建Dll有两种方式. 一.创建Non-MFC DLL动态链接库 1.打开File -> New -> Project选项,选择Win32 Dynamic-Link Library ->sample project ->工程名:DllDemo 2.新建一个.h文件DllDe

  • Python中函数的创建及调用

    目录 一.前言 二.创建一个函数 三.调用函数 四.pass空语句 一.前言 提到函数,大家会想到数学函数吧,函数是数学最重要的一个模块,贯穿整个数学学习,在Python中,函数的应用非常广泛.在前面我们已经多次接触过函数.例如,用于输出的print()函数.用于输入的input()函数,以及用于生成一系列整数的range()函数.这些都是Python内置的标准函数,可以直接使用.除了可以直接使用的标准函数,Python还支持自定义函数.即通过将一段有规律的.重复的代码定义为函数,来达到一次编写

  • Python中函数的创建与调用你了解吗

    目录 创建函数 调用函数 函数的参数 形参和实参 传递参数 位置参数 默认参数 函数的返回值 案例:计算任意两个数字的和 模块基础 定义模块 基本概念 导入模块 (import) 模块加载 (load) 模块特性及案例 模块特性 总结 创建函数 函数用 def 语句创建,语法如下: def 函数名(参数列表): # 具体情况具体对待,参数可有可无 """函数说明文档字符串""" 函数封装的代码 -- 标题行由 def 关键字,函数的名字,以及参数

  • MySQL存储过程的创建、调用与管理详解

    存储过程简介 为什么要用存储过程? MySQL5.0 版本开始支持存储过程. 大多数 SQL 语句都是针对一个或多个表的单条语句.并非所有的操作都那么简单.经常会有一个完整的操作需要多条语句才能完成. 存储过程简单来说,就是为以后的使用而保存的一条或多条 MySQL 语句的集合.可将其视为批处理文件.虽然他们的作用不仅限于批处理. 存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用. 存储过程的优点 通过把处理封装在容易使用的单元中,简化复杂的操作: 简化对变动的管理.如果表名.

  • VC6.0如何创建以及调用动态链接库实例详解

    小弟在公司的职责,在上篇博客中已经简约介绍.这边博客主要介绍技术的应用而不在细究原理.因为公司项目着急,出结果要紧,并且咱也不是专注搞研究的,所以,基本懂了原理后,直接上手工作,搞出demo来最好. 至于公司工作情况,今天暂且略过,当然也不是一两句能够表达清楚的.后面会有相应的工作总结,敬请期待-- 现在,废话少说,直奔主题--VC6.0中创建动态链接库. 作为客户与后台的中介,为了更好的调节两方的关系,我明智滴选择了webservice以及动态链接库.在与客户c++使动态链接库方式,而与后台j

  • 浅析在javascript中创建对象的各种模式

    最近在看<javascript高级程序设计>(第二版) javascript中对象的创建 •工厂模式 •构造函数模式 •原型模式 •结合构造函数和原型模式 •原型动态模式 面向对象的语言大都有一个类的概念,通过类可以创建多个具有相同方法和属性的对象.虽然从技术上讲,javascript是一门面向对象的语言,但是javascript没有类的概念,一切都是对象.任意一个对象都是某种引用类型的实例,都是通过已有的引用类型创建:引用类型可以是原生的,也可以是自定义的.原生的引用类型有:Object.A

  • 深入浅析Docker容器中的Patroni

    目录 创建镜像 文件结构 DockerFile entrypoint.sh function generatefile 构建镜像 运行镜像 总结 附图 上一篇文章向大家介绍了Repmgr的搭建过程,实现了自动切换,今天将向大家介绍,如何搭建容器下的Patroni集群环境,Patroni作为开箱即用PG高可用工具,越来越多的被各个厂商用于云环境下使用. patroni基本架构如图所示: etcd作为分布式注册中心.进行集群选主工作:vip-manager为主节点设置漂移IP:patroni负责引导

  • VC中控制台程序创建窗口的实例方法

    在VC控制台程序中调用D3DVideoRender时,需要创建新的窗口控件显示图像 #include "windows.h" #include "TCHAR.h" //声明自定义消息处理函数 LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); int _tmain(int argc, _TCHAR* argv[]) { HINSTANCE hInstan

  • javascript中的对象创建 实例附注释

    javascript中的对象创建声明: var obj = {}; 或者 var obj = new Object(); 为对象加入属性,方法: //=====第一种写法==================================== obj.name = '小明'; //为对象加属性 obj.updateName = function(name){//为对象定义updateName方法 this.name = name; } alert(obj.name); obj.updateNam

随机推荐