文档详情

DLL,线程互斥,设计模式.docx

发布:2016-12-15约8.92千字共11页下载文档
文本预览下载声明
动态链接库(Dynamic Link Library, DLL)的创建、调试与加载;Windows C++的线程、信号量、互斥锁和临界区,以及Linux C++线程、互斥锁、条件变量的基本知识;设计模式:一.主要学习内容1DLL的创建、调试和调用2Windows C++线程、信号量、互斥锁、临界区3Linux 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 XXXEXPORTSFunname1Funname2… 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 iostreamextern C doublemultiple (double x, double y){return (x*y);}extern C doubledivide(double x, double y){return (double)(x/y);}v.defLIBRARY vEXPORTSvmvCall.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 (!multiple || ! divide){printf(获取函数地址出错\n);}double x, y;scanf(%lf,%lf, x, y);printf(%f,%f\n, x, y);printf(%f\n, multiple (x, y));printf(%f\n, divide(x, y));FreeLibrary(ss);}运
显示全部
相似文档