- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
DLL,线程互斥,设计模式解读
动态链接库(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);}运
文档评论(0)