【转载】DLL调用方式

C++学习记录006——调用DLL(动态) C++ 动态调用动态链接库 阅读详情

DLL(动态连接库),然而可以分为动态调用于静态调用。下面我分别举一个例子说说。

1)动态调用:
首先:在VC++6.0中创建 Win32 Dynamic-link library工程创建一个动态连接库工程:
            在头文件TestDll.h中写下代码
             extern "C" int __declspec(dllexport) add(int numa, int numb);
            在源文件TestDll.cpp中实现改函数:
             int __declspec(dllexport) add(int numa, int numb)
             {
                       return numa + numb;
             }
其次,创建一个测试程序,TestDemo,创建一个.cpp文件,然后放下代码:
HINSTANCE hinstance;

typedef int (*lpAdd)(int a, int b);


lpAdd lpadd;

int main()
{
           hinstance = LoadLibrary("E://vc//DLL//TestDll//Debug//TestDll.dll");
           lpadd = (lpAdd)GetProcAddress(hinstance, "add");
           cout << "2 + 3 = " << lpadd(2, 3) << endl;
           FreeLibrary(hinstance);
           return 0;
}
而应用程序对本DLL的调用和对第2节静态链接库的调用却有较大差异,下面我们来逐一分析。

  首先,语句typedef int ( * lpAddFun)(int,int)定义了一个与add函数接受参数类型和返回值均相同的函数指针类型。随后,在main函数中定义了lpAddFun的实例addFun;

  其次,在函数main中定义了一个DLL HINSTANCE句柄实例hDll,通过Win32 Api函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDll;

  再次,在函数main中通过Win32 Api函数GetProcAddress得到了所加载DLL模块中函数add的地址并赋给了addFun。经由函数指针addFun进行了对DLL中add函数的调用;

     最后,应用工程使用完DLL后,在函数main中通过Win32 Api函数FreeLibrary释放了已经加载的DLL模块。

     通过这个简单的例子,我们获知DLL定义和调用的一般概念:

      (1)DLL中需以某种特定的方式声明导出函数(或变量、类);

      (2)应用工程需以某种特定的方式调用DLL的导出函数(或变量、类)。


2)静态连接:
代码如下:
#include <iostream>
using namespace std;

#pragma comment(lib,"Testlib.lib") 

//.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息
extern "C" __declspec(dllimport) add(int x,int y); 

int main()
{
          int result = add(2,3); 
          cout << result << endl;
          return 0;
}

dll的创建和调用 动态链接库英文为DLL,是Dynamic Link Library的缩写。dll是一个被其他应用程序调用的程序模块,其中封装了可以被调用的资源或函数。它是依附于EXE文件创建的的进程来执行的,不能够单独运行。每个程序都可以通过包含dll使用dll中包含的功能,这有助于避免代码重用和促进内存的有效使用。通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。 阅读详情

相关推荐

PInvoke之C#调用动态链接库DLL_v2.0

简单做一下总结叭,通过上述所描述的从第一步如何创建一个DLL到如何通过C#去调用的一个简单实例,也应该能给正在查阅相关资料的你有所收获,也希望能给在这方面有所研究的你有一些相关的启发,同时也希望能给目前对这方面毫无了解的你有一个更进一步的学习。C#实现排序所耗时: 130msC实现排序所耗时:3ms在实现本案例中,可能在编译后,大家所看到的结果不是很出乎意料,但这只是一种案例,希望通过此案例的分析,能给大家带来一些意想不到的收获叭。

baibaomen_org的博客 639

DLL生成与调用总结

DLL生成与调用

BrianO'con的博客 4008

【C++】多个类的DLL封装及调用

网上大多是将函数封装成dll的教程,类的封装也是基本相似的。 创建DLL 在VS2010中新建一个win32->dll工程。如我建立的工程名为FaceDLL 添加facedll.h的头文件(里面定义dll的接口,调用时会用到) #pragma once #ifdef FaceLIBDLL #define FACEAPI _declspec(dllexport) #else #defin

小魏的修行路 3万+

DLL的两种调用方法总结

DLL调用方式可以分为两类: 隐式调用(需要.lib 和.dll) 显式调用(需要.dll) 隐式调用 隐式加载就是在程序编译的时候就将dll编译到可执行文件中。这种加载方式调用方便,程序发布的时候可以不用讲dll带着.缺点是,这样编译出来后,程序会很大。 新建一个工程,将所需的.dll  .lib  .h放到工程目录下 //隐式加载dll #pragma comment(lib, ...

qq_39612543的博客 1万+

转载DLL调用的两种方式(IDE:VC6.0,C++)

DLL调用有两种方式,一种是静态调用,另外一种是动态调用(一)静态调用(二)动态调用 转载:https://www.cnblogs.com/Pickuper/articles/2050409.html (一)静态调用 静态调用是一种显式的调用方式,即在编程的时候便知道了被调用DLL中的接口函数,在编译链接的时候将DLL与工程生成的exe相关联。以MyApp.dll为例,具体的操作步骤如下: (1...

aboklh的博客 279

转载】Unity3D中调用C++动态链接库(dll)-两种方式(Managed Plugins 和 Native Plugins)

Unity3D中调用C++动态链接库(dll)-两种方式(Managed Plugins 和 Native Plugins) https://blog.csdn.net/kuaxianpan2004/article/details/86160840

yhx956058885的博客 587

asp.net里把汉子转为拼音

Imports chinese.MyxChinese Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim mypy As New chinese.MyxChinese TextBox2.Text = ...

weixin_30314631的博客 64

dll的两种调用方式

dll的两种调用方式,lib与dll区别 - [C/C++] 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://cjbskysea.blogbus.com/logs/48108094.html (1)lib是编译时需要的,dll是运行时需要的。 如果要完成源代码的编译,有lib就够了。 如果也使动态连接的程序运行起来,有dll就够了。

FrankieWang008的专栏 2万+

C语言创建和调用dll动态库

前言 C++在调用Dll中的函数的时候,如果是企业内部的话,肯定是希望三件套的方式(.h\.lib\.dll)。这样做的话,编写方可以在头文件中写入很多信息,方便调用方的调用。但是,一旦是给其他公司的人使用,而不想让别人看到的话,那编写方肯定是不想让别人看到过多的信息的,你只管调用。 还有一点是 dll是在调试的时候使用的,lib是编译的时候使用的,两者是不同时期使用的工具 写这个单纯为了我自己理解 1.创建dll 首先创建一个空的DLL文件,创建方法:新建——项目——Win32控制台程序...

weixin_58503231的博客 1万+

MFC生成调用DLL

前言: 转载前请联系作者,本帖原创请勿照抄。 CSDN有好多创建DLL的文章博客,总感觉有些步骤太过复杂今天教大家一种简洁的方式来创建DLL。五分钟带你成功生成DLL调用成功。 环境: VS2017 MFC(VC6、VS各个版本通用) 1.新建项目 1.1 新建》MFC》MFC DLL》CMFCLibrary1(项目名) 1.2选择共享MFC DLL 2.生成DLL(不需要引入...

断点 1330

使用LoadLibrary调用DLL中输出的class(转载

使用LoadLibrary调用DLL中输出的class著 Anup. V.译 李成竹  原文地址:http://www.codeproject.com/dll/classesexportedusingLL.asp·                     Demo下载- 21.4 Kb ·                     源码下载 - 5.88 Kb 引言

JamesXing的专栏 4204

Delphi 调用Dll的两种方式

Delphi 调用Dll的两种方式 unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Cla...

329

DLL的两种加载方式

DLL有两种调用方式 一,隐式加载(需要.lib和.dll) 二,显式加载(需要.dll)

enjoy5512的博客 1万+

QT调用C#写的Dll

QT调用C#写的Dll 参见: https://blog.csdn.net/weixin_42420155/article/details/81060945 C#写的dll是没有dllMain入口函数的,是一种中间语言,需要.Net运行时进行做本地化工作,因此如果要调用C#写的dll,需要依赖.Net运行时,然而Qt中还无法直接调用.Net...

weixin_34040079的博客 1055

VS2008 C++调用DLL 静态链接

一、DLL 生成   .h文件: #ifndef DllTest2_H_ #define DllTest2_H_ #ifdef MYLIBDLL #define MYLIBDLL extern "C" _declspec(dllimport) #else #define MYLIBDLL extern "C" _declspec(dllexport) #endif MYL

发展是曲折的但也是前进的 2744

python调用dll文件接口

转载 在Python中某些时候需要C做效率上的补充,在实际应用中,需要做部分数据的交互。使用python中的ctypes模块可以很方便的调用windows的dll(也包括linux下的so等文件),下面将详细的讲解这个模块(以windows平台为例子),当然我假设你们已经对windows下怎么写一个DLL是没有问题的。    引入ctypes库  [pyth

DemonDe的博客 1万+

易语言如何调用c dll文件,易语言调用C++写的DLL

直接调用会弹出堆栈错误的信息,原因是VS默认是__cdcel方式,而易语言是__stdcall,所以调用约定不一致导致堆栈错误。解决方案很简单,易语言声明DLL函数时“在库中对应命令名”函数名前加一个“@”符号即可。简单测试一下:头文件:#pragma once#include extern "C" __declspec(dllexport) int add1(int a, int b);CPP文...

weixin_33594195的博客 4116

获取DLL的文件路径以及调用DLL的文件路径

如何在DLL中,获取DLL本身的路径以及调用DLL的文件的路径呢?主要通过GetModuleFileName(HMODULEhModule,LPTSTR lpFilename,DWORD nSize)函数来获取,根据hModule参数来辨别是DLL本身还是DLL调用者。 当hModule 为NULL时候 获取到路径为调用者,当hModule为main入口的 BOOL APIENTRY Dll...

weixin_30689307的博客 1501
上一篇: 虚函数指针深入理解
rainyee
博客等级 码龄19年 10粉丝 2原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值