动态链接库的隐式动态链接和显示动态链接

创建dll工程:

 1 #include"CustomDll.h"
 2 #include<windows.h>
 3 BOOL APIENTRY DLLMAIN(HMODULE hModule, DWORD reason_for_call, LPVOID lpReserved)
 4 {
 5     switch (reason_for_call)
 6     {
 7     case DLL_PROCESS_ATTACH:
 8     case DLL_PROCESS_DETACH:
 9     case DLL_THREAD_ATTACH:
10     case DLL_THREAD_DETACH:
11         break;
12     }
13     return TRUE;
14 }
15 int DLLFuncAdd(int a, int b)
16 {
17     return a + b;
18 }

创建useDll工程,隐式动态链接:将dll工程编译好后的复制到useDll工程根目录下,然后使用如下代码

 1 #include<windows.h>
 2 #include"CustomDll.h"
 3 #include<iostream>
 4 using namespace std;
 5 #pragma comment (lib,"CustomDll")
 6 int main()
 7 {
 8     int c = 1, b = 2;
 9     cout << DLLFuncAdd(c, b) << endl;
10     return 0;
11 }

显示动态链接:在原dll工程中点击项目,添加新项,选中模块定义文件(.def),然后名称输入dll,确定

在dll.def文件中添加如下代码:

1 EXPORTS
2 DLLFuncAdd

然后在usedll工程中进行编辑,代码如下:

 1 #include<windows.h>
 2 #include<iostream>
 3 using namespace std;
 4 typedef int(*PFNEXPORTFUNC)(int a, int b);
 5 int main()
 6 {
 7 int c = 1, b = 2;
 8 HMODULE hModule = LoadLibrary(L"CustomDll.dll");
 9 if (hModule != NULL)
10 {
11     PFNEXPORTFUNC mDLLFuncAdd = (PFNEXPORTFUNC)GetProcAddress(hModule, "DLLFuncAdd");
12     if (mDLLFuncAdd != NULL)
13     {
14         cout << mDLLFuncAdd(c, b) << endl;
15     }
16     FreeLibrary(hModule);
17 }
18
19 return 0;
20 }

就行了。

时间: 2024-08-30 15:44:10

动态链接库的隐式动态链接和显示动态链接的相关文章

动态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运行时加载)

静态链接库在链接时,编译器会将 .obj 文件和 .LIB 文件组织成一个 .exe 文件,程序运行时,将全部数据加载到内存. 如果程序体积较大,功能较为复杂,那么加载到内存中的时间就会比较长,最直接的一个例子就是双击打开一个软件,要很久才能看到界面.这是静态链接库的一个弊端. 动态链接库有两种加载方式:隐式加载和显示加载. 隐式加载又叫载入时加载,指在主程序载入内存时搜索DLL,并将DLL载入内存.隐式加载也会有静态链接库的问题,如果程序稍大,加载时间就会过长,用户不能接受. 显式加载又叫运行

c#自定义类型的转换方式operator,以及implicit(隐式)和explicit (显示)声明的区别

msdn参考:http://msdn.microsoft.com/zh-cn/library/s53ehcz3.aspx http://msdn.microsoft.com/zh-cn/library/z5z9kes2.aspx http://msdn.microsoft.com/zh-cn/library/xhbhezf4.aspx operator 关键字来重载内置运算符,或提供类或结构声明中的用户定义转换.它可以定义不同类型之间采用何种转化方式和转化的结果. operator用于定义类型转

万恶之源:C语言中的隐式函数声明

1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自己主动依照一种隐式声明的规则,为调用函数的C代码产生汇编代码.以下是一个样例: int main(int argc, char** argv) { double x = any_name_function(); return 0; } 单纯的编译上述源代码.并没有不论什么报错,仅仅是在链接阶段由于找不到名为any_name_function的函数体而报错. [[email protected] t

隐式锁

Lock 是一种悲观的顺序化机制.它假设很可能发生冲突,因此在操作数据时,就加锁.如果冲突的可能性很小,多数的锁都是不必要的. Innodb 实现了一个延迟加锁的机制,来减少加锁的数量,在代码中称为隐式锁(Implicit Lock).隐式锁中有个重要的元素,事务ID(trx_id). 隐式锁的逻辑过程如下:A. InnoDB的每条记录中都一个隐含的trx_id字段,这个字段存在于簇索引的B+Tree中.B. 在操作一条记录前,首先根据记录中的trx_id检查该事务是否是活动的事务(未提交或回滚

C++ - 模板类模板成员函数(member function template)隐式处理(implicit)变化

模板类模板成员函数(member function template)隐式处理(implicit)变化 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24233693 指针支持隐式转换(implicit conversion), 在动态绑定中,派生类指针能够转换为基类指针. 可是模板的实例化(instantiations)之间, 是单独存在的, 派生类的实例化的模板(SmartPtr<Derived>), 不能转换为基类实例

【转载】关于oracle隐式转换以及转换时的优先级问题

以下转载自:http://blog.itpub.net/29324876/viewspace-1096741/ Oracle中对不同类型的处理具有显式类型转换(Explicit)和隐式类型转换(Implicit)两种方式,对于显式类型转换,我们是可控的,但是对于隐式类型转换,当然不建议使用, 因为很难控制,有不少缺点,但是我们很难避免碰到隐式类型转换,如果不了解隐式类型转换的规则,那么往往会改变我们SQL的执行计划,从而可能导致效率降低或其它问题.   1.1  隐式转换发生场景 1.对于INS

《C语言 — 隐式函数声明implicit declaration 》

1. 隐式函数声明概念 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码.下面是一个例子: int main(int argc, char** argv) { double x = any_name_function(); return 0; } 单纯的编译上述源代码,并没有任何报错,只是在链接阶段因为找不到名为any_name_function的函数体而报错. [[email protected] test]$ gcc

oracle 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理和自定义异常

游标的概念:    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁 盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库.这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率.游标有两种类型:显式游标和隐式游标.在前述程序中用到的SELECT...INTO...查询语句,一次只能从数据库中提取一行数据,对于这种 形式的查询和DML操作,系统都会使用一个隐式游标.但是如果要

linux下动态链接库(.so)的显式调用和隐式调用

进入主题前,先看看两点预备知识. 一.显式调用和隐式调用的区别 我们知道,动态库相比静态库的区别是:静态库是编译时就加载到可执行文件中的,而动态库是在程序运行时完成加载的,所以使用动态库的程序的体积要比使用静态库程序的体积小,并且使用动态库的程序在运行时必须依赖所使用的动态库文件(.so文件),而使用静态库的程序一旦编译好,就不再需要依赖的静态库文件了(.a文件). 动态库的调用又分为显示和隐式两种方式,区别如下: 1. 隐式调用需要调用者写的代码量少,调用起来和使用当前项目下的函数一样直接:而