创建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.为什么叫动态链接? 由于程序是在进程创建或程序运行时进行链接的,因此称为“动态链接”,与“静态链接”相对。静态链接是在程序构建时由链接器进行链接,将代码和数据组织在同一个可执行文件中的链接方式。
4.优点:DLL是程序模块化的重要方法,也为程序的复用提供了可能,同一个动态链接库可以被不同的进程加载。DLL中通常包括一些高复用性的代码,WindowsAPI就存在于动态链接库中。采用动态链接库后,同样的代码只需要有一份就可以,每个需要使用到这些功能的程序都使用同一份代码。将不同程序都可能使用到的一系列函数和数据放置在DLL中,可以大大减小应用程序的体积(多个程序共用一个模块),使程序更宜于升级与维护(如果程序需要更新,则只需要修改一个模块,不需要修改所有的程序)。
5.模块:每个可执行程序都可以称作一个模块,DLL文件是模块。exe文件也是模块,称为主模块。
6.特点:
DLL的编写与具体语言和编译器无关。只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如windows提供的系统DLL,在任何开发环境中都能被调用,不在乎C++,Delphi。
程序员在建立一个DLL文件时,连接器会自动为其生产一个对应的.lib文件,该文件包含了DLL导出函数的符号及序号(并不含有实际的代码)。在应用程序中,.lib文件将作为DLL的替代文件参与编译。
7.扩展:动态链接库技术室windows最重要的实现技术之一,windows的许多新功能,新特性都是通过DLL来实现的。其实windows本身就是由许多DLL组成的,它最基本的三大组成模块式Kernel32.dll(包含了用于内存管理,进程线程调度,系统文件的各个函数),GDI32.dll(主要处理图像方面的操作,如画图,显示文本),User32.dll(主要处理用户界面的操作,如窗口的创建和消息的发送)。它们在system32文件夹下。