DLL隐式链接

动态链接库有2种连接方式,一种是通过库直接加入(又叫隐式加载或载入时加载),一种是在运行时加入。后者很好理解,比如LoadLibrary(),GetProcAddress()获取想要引入的函数,使用完后,就FreeLibrary()。

reeLibrary是释放该动态链接库。而由于动态链接库是多进程共享的,因此调用FreeLibrary并不意味者动态链接库在内存中被释放,每个动态链接库都有一个变量用来记录它的共享引用技术,而FreeLibrary的功能只是将这个计数减一,只有当一个动态链接库的引用计数为0时,它才会被操作系统释放。

对于理解隐式加载,还需要特别说明,

隐式链接
隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。实现隐式链接很容易,只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以了。下面的例子通过隐式链接调用MyDll.dll库中的Min函数。首先生成一个项目为TestDll,在DllTest.h、DllTest.cpp文件中分别输入如下代码:
/Dlltest.h
#pragma comment(lib,"MyDll.lib")
extern "C"_declspec(dllimport) int Max(int a,int b);
extern "C"_declspec(dllimport) int Min(int a,int b);
//TestDll.cpp
#include<stdio.h>
#include"Dlltest.h"
void main()
{
 int a;
 a=min(8,10)
 printf("比较的结果为%d\n",a);
}

在创建DllTest.exe文件之前,要先将MyDll.dll和MyDll.lib拷贝到当前工程所在的目录下面,也可以拷贝到windows的System目录下。如果DLL使用的是def文件,要删除TestDll.h文件中关键字extern "C"。TestDll.h文件中的关键字Progam commit是要Visual C+的编译器在link时,链接到MyDll.lib文件,当然,开发人员也可以不使用#pragma comment(lib,"MyDll.lib")语句,而直接在工程的Setting->Link页的Object/Moduls栏填入MyDll.lib既可。
参考自:https://blog.csdn.net/zhongjling/article/details/8078537

原文地址:https://www.cnblogs.com/2f28/p/10012812.html

时间: 2024-08-29 19:34:01

DLL隐式链接的相关文章

Windows提供了两种将DLL映像到进程地址空间的方法(隐式和显式)

调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载时链接 这种方法需要DLL工程经编译产生的LIB文件,此文件中包含了DLL允许应用程序调用的所有函数的列表,当链接器发现应用程序调用了LIB文件列出的某个函数,就会在应用程序的可执行文件的文件映像中加入一些信息,这些信息指出了包含这个函数的DLL文件的名字.当这个应用程序运行时,也就是它的可执行文件

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

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

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

创建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_T

Dll的显式和隐式调用

隐式调用: 需要把生成动态链接库时生成的.lib文件加入到工程中去,在使用DLL时,只需说明一下就可以直接调用DLL中的函数,像调用程序内部的函数一样 显示调用: 需要使用LoadLibrary方式将自己生成的DLL文件先加载进来,在通过LoadLibrary返回的HINSTANCE,调用GetProcAddress获取想要的函数,然后就可以正常调用DLL中的函数 注意:在应用程序退出前,应该FreeLibrary来释放动态链接库 VC++中有两种方式来导出函数: 1. 通过_declspec

Dll的编写与Dll的显示调用和隐式调用

Dll的编写: 现在新建的Dll工程中创建一个新的类,我在这个类中简单定义了Add, Substract, Mutiply, Divide这4个方法 具体代码如下:(MathFuncs.h) #pragma once #ifndef _MathFuncs_H #define _MathFuncs_H //定义函数导出 #ifdef __cplusplus #define MyDll extern "C" __declspec(dllexport)   #else #define  My

.NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器

开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也不禁地对编译器内部到底为我们做了哪些事儿而感到好奇?于是,我们就借助反编译神器,去看看编译器到底做了啥事!其实本篇中很多都不算新语法,对于很多人来说可能都是接触了很久了,这里主要是针对.NET的老版本来说,是一个“相对”的新语法. /* 新语法索引 */ 1.自动属性 Auto-Implemente

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

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

poj1482(隐式图求最短路)

题目链接 题意:补丁在修正bug时,有时也会引入新的bug.假定有n个潜在的bug m个补丁,每个补丁用两个长度为n的字符串表示,其中字符串的每个位置表示一个bug,第一个串表示打补丁之前的状态('-'表示该bug必须不存在,'+'表示必须存在,0表示无所谓,第二个串表示打补丁之后的状态(-'表示不存在,'+'表示存在,0表示不变).每个补丁都有一个执行时间,你的任务使用最少的时间把一个bug都存在的软件通过打补丁的方式变得没有bug.一个补丁可以打多次. 解法:状压表示每个补丁的存在与否.隐式

javascript隐式转换详解

Javascript是web前端开发的必学技术,今天和大家分享的就是javascript的基础知识隐式转换,希望可以帮助大家更好的学习. 转换成布尔类型假 undefined->falSe null->falSe 数值型0或0.0或NaN->falSe 字符串长度为0->falSe 其它对象->true <html> <head> <meat charSet=”utf-8”> <title></title> <