- 1、本文档共42页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动态链接库的显式调用 1 装入动态链接库 2 取得函数地址 3 调用动态链接库的实例 1.装入动态链接库 在显式使用动态链接库之前,必须先把动态链接库装入内存,该操作主要靠函数LoadLibrary()来实现。 下面是该函数的原型说明。 HMODULE LoadLibrary( LPCTSTR lpFileName // 动态链接库文件的名称 ); 当应用程序试图把lpFileName所指向的动态链接库装入内存时,会先从系统中查找,如果这个动态链接库已经在内存中,则系统会增加这个动态链接库的使用计数,并返回这个动态链接库的句柄。如果不在内存中,则系统会先查找该文件,如果没有文件的路径,则在当前目录或在系统目录中查找,并把该文件装入内存,最后返回该动态链接库的句柄。 2取得函数地址 一个动态链接库中可以包含多个导出函数,当通过调用LoadLibrary()取得指定动态链接库模块的句柄,要想使用该模块中的某个函数,首先必须取通过GetProcAddress取得该函数的地址。 FARPROC GetProcAddress( HMODULE hModule, //动态链接库的句柄 LPCSTR lpProcName //导出函数的名称 ); 该函数将hModule所指的动态链接库中的lpProcName所指定的函数装入内存。当取得函数的地址后,就可以使用该函数,使用完后,调用FreeLibrary()释放动态链接库。 范例: 1.打开VS2010,依次选择文件—新建—项目—MFC DLL,在下方名称栏中输入工程命名OneDLL,在位置栏中选择存放工程文件的路径—确定—点击下一步—DLL类型:使用共享 MFC DLL 的规则 DLL—点击完成。 其中我们感兴趣的是OneDLL.cpp文件和OneDLL. def文件。 OneDLL.cpp文件是DLL的主要的源代码文件,它包含了COneDLLApp类的定义; OneDLL.def文件包含了DLL提供的关于DLL在Wind ows下运行的一些信息,在这个文件中定义了一些参数,如DLL的名称和属性等,还声明了从DLL中输出的函数。 2添加实现代码,黑色加粗部分为添加的代码。 #include stdafx.h #include OneDLL.h #ifdef _DEBUG #define new DEBUG_NEW #endif int Message(void); BEGIN_MESSAGE_MAP(COneDLLApp, CWinApp) ………………………………….. int Message(void) { MessageBox(NULL,_T(This is the example of testing DLL.),NULL,MB_OKCANCEL); return 1; } ? 记得设为为多字节而非unicode编码。 3修改.def文件: OneDLL.def : 声明 DLL 的模块参数。 ? LIBRARY OneDLL EXPORTS Message? ; 此处可以是显式导出 ? 4.点击生成——生成解决方案,可以生成相关的lib文件和dll文件,在OneDLL\Debug进行查看生成的文件。 5新建调用DLL(OneDLL)的MFC工程。 新建一个基于MFC框架的单文档工程TestDLL,并在TestDLLView.cpp文件开始处添加 HINSTANCE handlerDLL=NULL; //创建dll句柄?? typedef int(* MESSAGE)(void); ?//声明函数指针 MESSAGE Message; ? 然后在菜单中添加DLL主菜单、子菜单,如下图所示,以及View类下的菜单响应函数。子菜单ID分别为IDDLLLOAD和IDDLLTEST 在loaddll菜单项添加以下代码: if(handlerDLL!=NULL) { MessageBox( _T(The OneDLL.DLL has been loaded.) ); return; } ? handlerDLL=LoadLibrary( _T(OneDLL.DLL) ); ? if(handlerDLL==NULL) { MessageBox( _T(Cannot Load the OneDLL.DLL) ); } else { MessageBox( _T(Load the OneDLL.DLL successful!) );} ? Message=(MESSAGE)GetProcAddre
文档评论(0)