两种方法对于你的程序调用动态库时没有任何区别,只是你在编程时,步骤是不一样的。显式调用麻烦了点,但可以没有相应的lib库;隐式调用,使用起来比较

简单,有函数的声明(头文件.h)就可以了,但必须有lib库。

在VC中两种方式的具体方法:

一、动态库的隐示调用: 在 VC 工程中直接链接静态输入库XXX.lib,然后即可像调用其它源文件中 的函数一样调用DLL中的函数了。

二、动态库的显式调用: 显式调用动态库步骤:

  1、创建一个函数指针,其指针数据类型要与调用的 DLL 引出函数相吻 合。

   2、通过 Win32 API 函数LoadLibrary()显式的调用DLL,此函数返回 DLL 的实例句柄。

   3、通过 Win32 API 函数GetProcAddress()获取要调用的DLL 的函数地 址,把结果赋给自定义函数的指针类型。

   4、使用函数指针来调用 DLL 函数。

   5、最后调用完成后,通过 Win32 API 函数FreeLibrary()释放DLL 函数。

#include <stdio.h>
#include <Windows.h>
#include <tchar.h>
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//HMODULE head;
HMODULE hModule;
typedef int ( *fun1)(int ,int );
typedef int (_cdecl *fun2)(int ,int );
hModule=LoadLibrary(_TEXT("../ceshidll.dll")); fun1 f1 =(fun1)GetProcAddress(hModule,"add");
if (f1==NULL)
{
cout<<"f1没有导出"<<endl;
//return -1;
}
fun2 f2 =(fun2)GetProcAddress(hModule,"sub");
if (f2==NULL)
{
cout<<"f2没有导出"<<endl;
//return -1;
}
cout<<f1(1,2)<<endl;
cout<<f2(2,3)<<endl;
FreeLibrary(hModule);
system("pause");
}

c++调用动态库失败解决办法

之前写好的程序今天早上过来发现在服务器上出错了,于是就各种查问题,整整一个早上外加下午两个小时都在查这个问题,最终被我找到了问题;

在程序中我发现LoadLibrary()返回的句柄是空的,于是用GetLastError()看了一下,返回值是193,因此可以断定应该是动态库出问题了,所以就用Depends查看了一下程序中依赖的动态库,发现该动态库还缺少另外的一个动态库,导致程序在加载过程中出现了错误,现在才回想起来,之前因为新需求,在原有的动态库上添加新功能,从而调用了另外的一个库,但是在更新服务器程序的时候忘记把最后依赖的动态库更新到服务器上,因此才出现了这个问题,问题虽小,但是也算是一个教训吧,以后一定会记住的。

如果程序动态库调用失败,我个人觉得首先就行该查看一下这个库是不是依赖其他的库,在此可以借助Depends查看,如果都不缺,那么就应该查看导出函数的导出方式和主调程序的声明方式是否一致,最后就是确定调用库函数的接口参数是否有问题了。

要调用动态库必须要包含头文件吗?

静态连接必须要。

动态调用可以不要。不过还是要知道有哪些函数,怎么声明的。

不一定需要。创建一个库一般处于一下两种目的:
1、把一些相关的代码,打包成一个库,发布给其它的人用。
这中情况是最常见的情况,如写 C 语言用到 libgcc。在这种情况下,你除了提供库文件:静态库[ windows 下 .lib,linux .a];动态库:[Windows 下 .dll,Linux 下 .so] 之外,必须提供头文件。头文件是你这个库里面提供了那些接口可以供外界使用。如果没有头文件,其他人无法使用。

2、为某些软件写插件。
很多大的项目,都是模块化设计,留有一些特定的接口,方便定制。当程序运行时,会动态加载制定目录下的动态库,运行时调用动态库里面约定好的方法。
这种情况无需提供头文件,但要按照特定的约定来实现这个库。

大概就是以上这些情况。

总结:动态库的两种调用方式

一、静态调用
1、添加动态库函数声明头文件
2、在.h文件中添加如下语句
#pragma comment(lib, ".\\****.lib")
.\\****.lib为动态库的绝对路径。
就可以调用动态库中的函数了。

二、动态调用

1、定义一个与动态库函数接受参数类型和返回值均相同的函数指针类型。
typedef int (* lpAddFun)(int ,int);
lpAddFun addFun;
2、HINSTANCE hDll;
hDll=LoadLibrary("****.dll");//动态加载DLL模块句柄
3、得到所加载DLL模块中函数的地址
addFun=(lpAddFun) GetProcAddress(hDll,"Add_new");
之后就可以使用

提示若动态库程序和调用动态库的程序在一个解决方案中可以利用项目依赖项,定义项目生成顺序。也可以在调用动态库程序右键属性 -> c/c++ ->常规的附加包含目录中填入动态库目录。然后用形如
#ifdef _DEBUG
#pragma comment(lib,"..\\Debug\\TestDll.lib")
#else
#pragma comment(lib,"..\Release\\TestDll.lib")
#endif
这种方式静态加载动态库

VC++中动态链接库的显示加载和隐式加载的区别的更多相关文章

  1. dll显式加载与隐式加载

    使用动态DLL有两种方法,一种是隐式链接,一种是显式链接,如果用loadlibrary就是显示链接,用lib就属于隐式链接. 两种方法对于你的程序调用动态库时没有任何区别,只是你在编程时,步骤是不一样 ...

  2. DLL动态库的创建,隐式加载和显式加载

    动态库的创建 打开VS,创建如下控制台工程,工程命名为DllTest: 在弹出的对话框中选择"DLL"后单击"完成"按钮: 在工程中新建DllTest.h和Dl ...

  3. C#显示接口实现和隐式接口实现

    在项目中可能会遇到显示接口实现和隐式接口实现.什么意思呢?简单来说使用接口名作为方法名的前缀,这称为“显式接口实现”:传统的实现方式,称为“隐式接口实现”.隐式接口实现如下: interface IS ...

  4. 《Entity Framework 6 Recipes》中文翻译系列 (28) ------ 第五章 加载实体和导航属性之测试实体是否加载与显式加载关联实体

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-11  测试实体引用或实体集合是否加载 问题 你想测试关联实体或实体集合是否已经 ...

  5. selenium中的三种等待方式(显示等待WebDriverWait()、隐式等待implicitly()、强制等待sleep())---基于python

    我们在实际使用selenium或者appium时,等待下个等待定位的元素出现,特别是web端加载的过程,都需要用到等待,而等待方式的设置是保证脚本稳定有效运行的一个非常重要的手段,在selenium中 ...

  6. ORACLE数据库中执行计划出现INTERNAL_FUNCTION一定是隐式转换吗?

    ORACLE数据库中,我们会使用一些SQL语句找出存在隐式转换的问题SQL,其中网上流传的一个SQL语句如下,查询V$SQL_PLAN的字段FILTER_PREDICATES中是否存在INTERNAL ...

  7. 显示转换explicit和隐式转换implicit

    用户自定义的显示转换和隐式转换 显式转换implicit关键字告诉编译器,在源代码中不必做显示的转型就可以产生调用转换操作符方法的代码. 隐式转换implicit关键字告诉编译器只有当源代码中指定了显 ...

  8. Oracle12c中PL/SQL(DBMS_SQL)新特性之隐式语句结果(DBMS_SQL.RETURN_RESULT and DBMS_SQL.GET_NEXT_RESULT)

    隐式数据结果特性将能简化从其他数据库到Oracle12c存储过程迁移.1. 背景T-SQL中允许查询结果的隐式返回.例如:下面T-SQL存储过程隐式返回查询结果.CREATE PROCEDURE Ge ...

  9. MVC 的 Razor引擎显示代码表达式与隐式代码表达式

    隐式代码表达式 就是一个标识符,之后可以跟任意数量的方法调用("()").索引表达式("[]")及成员访问表达式(".").但是,除了在&q ...

随机推荐

  1. HDUOJ--1874 畅通工程续

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  2. Android应用程序结构总结

    Android应用程序结构分析 由于是初学者,对于Android应用程序的结构的认识是一穷二白的,对于开发Android应用程序,必须先了解其程序的结构和作用.一下就用一个简单的例子来解剖: 从上图的 ...

  3. C#趣味程序---车牌号推断

    甲说前两位同样,乙说后两位同样,丙说四位的车牌号刚好是一个数的平方.这个车牌号是多少? using System; namespace ConsoleApplication1 { class Prog ...

  4. MySQL中 如何查询表名中包含某字段的表 ,查询MySql数据库架构信息:数据库,表,表字段

    --查询tablename 数据库中 以"_copy" 结尾的表 select table_name from information_schema.tables where ta ...

  5. haproxy 制作使用ssl

    http://www.oschina.net/translate/haproxy-ssl-termation-pass-through

  6. swfupload详解

    前提: Ajax解决了不刷新页面提交表单,但是却没有解决文件上传不刷新页面,当然也有其它技术让不刷新页面而提交文件,该技术主要是利用隐藏的iFrame,较Ajax要麻烦许多,而且其提交方式依然在底层是 ...

  7. 成员函数的重载&amp;&amp;隐藏&amp;&amp;覆盖

    /* *成员函数的重载,覆盖,隐藏 *重载: *1.同样的范围(在同一个类中) *2.函数名同样 *3.參数不同 *4.virtualkeyword可有可无 *覆盖是指派生类覆盖基类的函数,特征是: ...

  8. Django修改用户名密码的方法

    1.python manage.py shell 2.from django.contrib.auth.models import User 3.user=User.objects.get(usern ...

  9. 【Android】6.3 ProgressDialog

    分类:C#.Android.VS2015: 创建日期:2016-02-08 一.简介 进度条对话框(ProgressDialog)常用于不能在短时间内快速完成的操作,显示进度条的目的是为了让用户明白程 ...

  10. IOS5 ARC unsafe_unretained等说明

    转自:http://blog.csdn.net/bsplover/article/details/7707964 iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是 ...