[DLL]DLL概述和动态调用DLL

创建DLL工程

新建项目: Visual C++ -> Win32项目,名称:myDLL

下一步,选择DLL,确定。

修改文件名myDLL.cpp改为myDLL.c;不然调用DLL时会出现错误代码127(找不指定程序,就是找不到导出函数ExportMsg)

//#include "stdafx.h"
#include <Windows.h>
#include <tchar.h>

// 使用__declspec(dllexport)声明导出函数
_declspec(dllexport) DWORD ExportMsg(LPTSTR szMsg); 
DWORD ExportMsg(LPTSTR szMsg)
{ 
	MessageBox(NULL,szMsg,_T("由导出函数弹出的消息!"),MB_OK); 
	return 0;
}

编译将生产myDLL.lib和myDLL.dll

动态调用DLL

三段式:LoadLibrary——GetProcAddress——FreeLibrary;加载库,获取函数地址,释放库。

新建工程:UseDLL

#include "stdafx.h"
#include <iostream>
using namespace std;

#include <Windows.h>
// 指向函数的指针类型
typedef DWORD (*MY_EXPORT_PROC)(LPTSTR);
void Test()
{  
	// 获得Dll模块句柄
	HINSTANCE hinstLib = LoadLibrary(TEXT("myDLLTwo.dll"));  
	// 是否加载成功
	if (hinstLib != NULL) 
	{  
		// 获得指定导出函数的地址
		MY_EXPORT_PROC lpProcAdd = (MY_EXPORT_PROC) GetProcAddress(hinstLib, "ExportMsg");   
		// 判断是否成功
		if ( lpProcAdd !=NULL) 
		{  
			(lpProcAdd) (_T("hello world!!!!")); 
		} 
		// 释放DLL 
		FreeLibrary(hinstLib); 
	} 
}
int main()
{
	Test();  
	return 0;
}

注意:UseDLL.exe文件要与myDLL.dll文件在同一个目录

介绍DLL

DLL(动态链接库):是作为共享函数库的可执行文件。

1.作用:动态链接库是将程序模块化的重要方法,应用程序开发中,需要在多个进程和模块间共用代码的情况下,动态链接库是很好的解决方法。在运行时,只有当exe程序确实要调用这些DLL模块的情况下,系统才会将他们装载到内存空间中。这样可以减少了exe文件的大小和对内存空间的需求,而且这些DLL模块可以同时被多个应用程序使用。

2.内部构成:动态链接库文件中包含若干公用的代码、数据等,供其他模块使用。

3.优点:

a.DLL 是程序模块化的重要方法,也为程序的复用提供了可能,同一个动态链接库可以被不同的进程加载。DLL 中通常包括一些高复用性的代码,Windows API 就存在于动态链接库中。

b.采用动态链接库后,同样的代码只需要有一份就可以,每个需要使用到这些功能的程序都使用同一份代码。将不同程序都可能使用到的一系列函数和数据放置在 DLL 中,可以大大减小应用程序的体积(多个程序共用一个模块),使程序更宜于升级与维护(如果程序需要更新,则只需要修改一个模块,不需要修改所有的程序)。

4.特点:

a.DLL的编写与具体语言和编译器无关。只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如windows提供的系统DLL,在任何开发环境中都能被调用,不在乎C++Delphi

b.程序员在建立一个DLL文件时,连接器会自动为其生产一个对应的.lib文件,该文件包含了DLL导出函数的符号及序号(并不含有实际的代码)。在应用程序中,.lib文件将作为DLL的替代文件参与编译。

5.动态链接过程 

在进程创建时,系统会从 exe 文件的导入表中知道 exe文件会调用哪些动态链接库的哪些函数,在进行初始化时,将动态链接库加载到内存的虚拟地址空间中,并调整好函数调用的指针的地址。这样程序就可以调用 DLL 中的函数。由于程序是在进程创建或程序运行时进行链接的,因此称为“动态链接”,与“静态链接”相对。静态链接是在程序构建时由链接器进行链接,将代码和数据组织在同一个可执行文件中的链接方式。

6.为什么叫动态链接?    由于程序是在进程创建或程序运行时进行链接的,因此称为“动态链接”,与“静态链接”相对。静态链接是在程序构建时由链接器进行链接,将代码和数据组织在同一个可执行文件中的链接方式。

7.为什么可以被不同的进程加载?内存分页管理将多个虚拟内存分页映射到同一个物理分页上。因此在物理内存中,系统 DLL的代码只有一份。

8.模块:每个可执行程序都可以称作一个模块,DLL 文件是模块。exe 文件也是模块,称为主模块。

9.扩展:动态链接库技术室windows最重要的实现技术之一,windows的许多新功能,新特性都是通过DLL来实现的。其实windows本身就是由许多DLL组成的,它最基本的三大组成模块式Kernel32.dll(包含了用于内存管理,进程线程调度,系统文件的各个函数),GDI32.dll(主要处理图像方面的操作,如画图,显示文本),User32.dll(主要处理用户界面的操作,如窗口的创建和消息的发送)它们在system32文件夹下。

10.dll与进程、线程之间的关系

  • DLL模块被映射到调用它的进程的虚拟地址空间。
  • DLL使用的内存从调用进程的虚拟地址空间分配,只能被该进程的线程所访问。
  • DLL的句柄可以被调用进程使用;调用进程的句柄可以被DLL使用。
  • DLL使用调用进程的栈。

你可能感兴趣的:([DLL]DLL概述和动态调用DLL)