由于每次使用动态链接库的时候都要重新去查资料,查调用方式,有些烦躁,本人抽点时间在此做个总结,希望可以对需要的朋友有所帮助。

1,显式加载方式加载动态链接库

简单易懂,随掉随用

(1)          将dll考到当前工作目录,或者使用GetModuleFileName函数获取当前执行目录得到相对路径,亦或者使用绝对路径进行加载。

(2)          得到dll实例句柄

HMODULE LoadLibrary( LPCTSTR lpFileName )

( 3 ) 获取dll中导出函数的地址

FARPROC GetProcAddress( HMODULE hModule,LPCSTR lpProcName )

Ex:typedef int (*ADDPROC)( int a, int b )

ADDPROC Add=(ADDPROC)GetProcAddress(hinst,”add”);

(4)FreeLibrary()调用结束释放实例。

2         隐式加载方式加载动态链接库

一:基本调用流程

(1)      使用_declspec(dllexport)导出函数

比如

_declspec(dllexport) int add( int a,  int b  )

添_stdcall extern c可有效解决名字改编问题

_stdcall extern c _declspec(dllexport) int add( int a,  int b  )

(2)  将dll文件考到当前工程,并连接lib文件

Vc6可以通过link连接,vs系列可以通过依赖库连接

或者使用一种通用的方式加载,通过路径加载

#pragma comment(lib,"../SDK/Sadp.lib")

(3)在调用处用extern做外部定义声明

Ex:extern int add( int a , int b )

或者_declspec(dllimport) int add( int a,  int b  )

二:模块定义文件(可有效解决名字改编问题)参考网络通信库

Library xxx.dll

EXPORTS

Add。。。。

3         显式加载和隐式加载的比较

个人比较崇尚显示加载两个原因:

1,        随掉随用,易懂,并且不会因为某一个导出函数的调用的失败导致程序的崩溃

2,        节省内存,调用结束直接释放实例,而隐式加载从程序开始运行就一直伴随着程序的整个过程,当dll比较多的时候很浪费内存。

visual c++ 动态链接库调用总结的更多相关文章

  1. C/C++程序通过动态链接库调用MATLAB程序

    C/C++程序通过动态链接库调用MATLAB程序 1 MATLAB编译器设置 需要设定对应的C++编译器才能编译.m文件生成可供C++调用的库文件. 在MATLAB命令行输入:mex –setup:然 ...

  2. Linux下c++通过动态链接库调用类

    http://hi.baidu.com/ablenavy/item/b498901c6826bbf587ad4e33 Linux下的动态链接库叫so,即Shared Object,共享对象.一些函数就 ...

  3. 使用visual studio 2015调用阿里云oss .net sdk 2.2的putobject接口抛出outofmemory异常

    问题描述: 使用阿里云oss .net sdk 2.2版本,使用putobject接口上传文件时,抛出outofmemory异常. 原因分析: 上传时,用于准备上传的数据缓冲区内存分配失败.与应用软件 ...

  4. Visual Studio/Eclipse调用 JBoss5中的WebService

    1. HelloWebService.java package com.xx.webservices; import javax.jws.WebMethod; import javax.jws.Web ...

  5. Visual C# 2015调用SnmpSharpNet库实现简单的SNMP元素查询

    一开始调研发现有几个SNMP的库, 一个是net-SNMP,这个好像是linux用的多 一个是微软自己的WinSNMP,这个没有例子,不太好操作 一个是SnmpSharpNet,这个有些例子比较好, ...

  6. vs 2010调用matlab dll显示窗口核心代码

    matlab代码: figure('NumberTitle','off','menubar','none','toolbar','none','name','Topo Image'); x=0:pi/ ...

  7. vs 连接过程报错 dll 分析 ------- DLL动态链接库

    1:编译成功,说明代码没有问题了2:连接报错,说明 exe 在查找dll 的入口地址过程,找不到合适的信息,这些信息保存在 dll 对应的 *.lib 文件里面  说明:exe如果生成成功了lib 这 ...

  8. LoadRunner 调用dll方法

    本文主要介绍简单DLL的编写方法及在LoadRunner中局部调用与全局调用DLL方法. 1.动态链接库的编写 在Visual C++6.0开发环境下,打开FileNewProject选项,可以选择W ...

  9. .NET 7 AOT 的使用以及 .NET 与 Go 互相调用

    目录 背景 C# 部分 环境要求 创建一个控制台项目 体验 AOT 编译 C# 调用库函数 减少体积 C# 导出函数 C# 调用 C# 生成的 AOT Golang 部分 安装 GCC Golang ...

随机推荐

  1. iOS 8中CLLocationManager及MKMapView showUserLocation失败的解决的方法

    用XCode 6编译的原来XCode 5.1.1写的程序时,发现原来写的CLLocationManager定位的代码以及MKmapView的showUserLocation失效.查了一下,XCode ...

  2. POJ 2502 Subway (Dijkstra 最短+建设规划)

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6689   Accepted: 2176 Descriptio ...

  3. Swift初体验(两)

    // 写功能初体验 func getMyName(firstName first:String, lastName last:String) -> String{ //return first ...

  4. 关于C#操作INI文件的总结

    原文:关于C#操作INI文件的总结   INI文件其实是一种具有特定结构的文本文件,它的构成分为三部分,结构如下: [Section1]key 1 = value2key 1 = value2--[S ...

  5. Linux_下安装MySQL

    linux下mysql 最新版安装图解教程 1.查看当前安装的linux版本 命令:lsb_release -a 如下图所示 通过上图中的数据可以看出安装的版本为RedHat5.4,所以我们需要下载R ...

  6. SQL Server AlwaysON 同步模式的疑似陷阱

    原文:SQL Server AlwaysON 同步模式的疑似陷阱 SQL Server 2012 推出的最重要的功能之一Alwayson,是一个集之前Cluster和Mirror于一体的新功能,即解决 ...

  7. 【转】UIAutomator定位Android控件的方法实践和建议(Appium姊妹篇)

    原文地址:http://blog.csdn.net/zhubaitian/article/details/39777951 在本人之前的一篇文章<<Appium基于安卓的各种FindEle ...

  8. HTML的标签canvas

    定义和使用方法 <canvas> 标签定义图形,比方图表和其它图像. <canvas> 标签仅仅是图形容器,您必须使用脚本来绘制图形. 实例 怎样通过 canvas 元素来显示 ...

  9. dojo的TabContainer添加ContentPane假设closable,怎么不闭幕后予以销毁ContentPane

    其主要思想是新的TabContainer的扩展类,重载其closeChild属性,使得其在关闭子容器时.不调用该子容器的destroyRecursive方法. define([ "dojo/ ...

  10. 被FusionCharts V3.4抛弃的东西

    从FusionCharts Suite XT V3.4開始,FusionCharts产品家族放弃了Flash,发展成为一个纯JavaScript的图表组件.前面我们介绍了怎样升级到V3.4,接下来让我 ...