- 1、本文档共11页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动态链接库(Dynamic Link Library, DLL)的创建、调试与加载;Windows C++的线程、信号量、互斥锁和临界区,以及Linux C++线程、互斥锁、条件变量的基本知识;设计模式:
一.主要学习内容
1
DLL的创建、调试和调用
2
Windows C++线程、信号量、互斥锁、临界区
3
Linux C++互斥锁、条件变量、线程
4
观察者模式
5
单例模式
6
代理模式
7
适配器模式
8
简单工厂模式/工厂方法模式
二.主要收获
1. DLL相关知识:动态链接库?其他应用程序共享的程序模块,封装了一些资源(数据、方法和类)。本身包含代码却不能执行,Windows应用能直接或间接调用。
静态链接:调用函数或过程需要链接到.exe可执行文件中。
动态链接:DLL中的代码无需包含在.exe中,节省了宝贵的内存资源。
动态链接的优点:
? 共享代码、资源和数据。
? 过程隐藏
? 与语言无关,增强了扩展性 (一种语言应用程序可以调用其他语言的DLL)
2. DLL的创建方法
VS2013新建DLL工程,选上导出符号,系统会自动生成导出DLL所需要的各种符号定义包括:
#ifdef XXX_EXPORTS
#define XXX_API __declspec(dllexport)
#else
#define XXX_API __declspec(dllimport)
#endif
其中XXX为你的DLL文件名
这个#idndef模块中的__declspec(dllexport)修饰的函数,告诉编译器这是DLL导出的函
数,而__declspec(dllimport)告诉编译器这是从DLL导入的函数。一般,我们只使用前者就行。__declspec(dllimport)在导出静态变量时用到。为了简化,也可以采取模块定义的方式:源文件中添加.def文件(注:与DLL工程同名)
Library XXX
EXPORTS
Funname1
Funname2
…
DLL项目模板有导出变量、函数和类,可以根据实际情况添加自己想要实现封装的代
码。此外还有stdafx.h头文件以及DLLMAIN函数,一般不做修改。编译生成后就可
以得到XXX.dll和XXX.lib文件。
单独生成的.lib文件用于静态编译,所有信息都包含其中,不再需要.dll文件,编译时
连接到应用程序会使程序过大。而和.dll文件一起生成的.lib文件则只包含了导出函数
的名称和位置,具体实现都在.dll文件中,隐式加载时一起使用,动态加载时只需.dll
文件。
3. DLL的调用
DLL的调用分为隐式调用和显式调用两种:
隐式调用:又分为三种加载方式(需要.lib文件)
? 直接将.lb文件加入到工程文件中,作为资源文件。
? 通过工程设置菜单,选中Link,在其中添加.lib文件
? 使用代码方式,#pragma comment(lib,”../../XXX.lib”),同时需要编写DLL时的头文件
显示调用:
只需要.dll文件,通过API完成。具体通过LoadLibraryA函数将DLL映射到进程的内存空间,实现动态加载,然后使用GetProAddress函数获取DLL中函数风地址。使用完DLL后,用FreeLibrary函数从进程空间显示卸载DLL。
例:v.dll文件的创建
v.cpp
#include iostream
extern C double multiple (double x, double y)
{
return (x*y);
}
extern C double divide(double x, double y)
{
return (double)(x/y);
}
v.def
LIBRARY v
EXPORTS
v
m
vCall.cpp
#include stdio.h
#include Windows.h
#pragma warning(disable:4996)
typedef double(*lp)(double, double);
typedef void(*lr)();
void main()
{
HINSTANCE ss = LoadLibraryA(D:\\VS2013项目\\myDll\\Debug\\v.dll);
if (!ss)
{
printf(加载DLL文件出错\n);
}
lp multiple = (lp)GetProcAddress(ss, multiple );
lp divide = (lp)GetProcAddress(ss, divide);
if (!m
文档评论(0)