新建项目: 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
三段式: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(动态链接库):是作为共享函数库的可执行文件。
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与进程、线程之间的关系