例程详析动态链接库

原创 2004年08月02日 11:14:00
文章标题:例程详析动态链接库
原 作 者:bull77
原 出 处:www.yesky.net
发 布 者:loose_went
发布类型:转载
发布日期:2004-05-08
今日浏览:11
总 浏 览:1468

 动态链接库(DLL,即 Dynamic-Link Library)是可执行的模块,但它没有自己的堆栈,必须在调用动态链接库函数的程序环境下运行。动态链接库不仅可以作为一个运行模块,包括函数代码,而且可以包含程序以外的任何数据或资源(位图、图标等等)。动态链接库就是给应用程序提供函数或者资源。

  动态链接与静态链接是相对立的。静态链接的时候,可执行程序内包含了所访问的函数的代码,可执行程序占用的空间较大;但运行时,不需要其他模块支持,从而速度相对较快。动态链接的可执行程序中不包含动态访问的函数代码,仅仅包含对它的参考,运行时需要其他模块(DLL)的支持,速度相对较慢。

  动态链接库是Windows的一种极其重要的技术。它使得开发人员可以通过编写动态链接库,方便灵活的实现大型程序的开发,按自己的意愿对操作系统进行扩展。

  下面通过例子介绍如何在动态链接库中定义函数、资源、和类以及如何在工程中使用动态链接库中已定义的函数、资源、类。

  一、 函数的定义和使用方法:

  第一步:

   运行AppWizard,定义项目名为mydll,选择MFC AppWizard(dll),而不是MFC AppWizards(exe)。

  第二步:

   在这个例子中,只有一个AppWizard屏幕出现,选择MFC扩展DLL(MFC Extension DLL (using shared MFC DLL),点击FINISH生成工程。

  第三步:

   点击File中的New,选择C/C++ Header File,File Name中输入dll,点击OK,创建dll.h。输入extern "C" __declspec(dllexport) int fun(int x1,int x2,int x3); ,保存。

  第四步:

   点击File中的New,选择C++ Source File,File Name中输入dll,点击OK,创建dll.cpp。输入

  #include "stdafx.h"
  #include "dll.h"
  extern "C" __declspec(dllexport) int fun(int x1,int x2,int x3)
   {
    return x1+x2+x3;
   }

  编译生成mydll.dll和mydll.lib。

  第五步:

  选择Project 中Add To Project 中的New , 重新生成一个工程,选择MFC AppWizards(exe),项目名为mydlltest , 选择Single Document ,点击FINISH,生成一个新的工程。选择菜单中的Project àSet Active Project àmydlltest ,将mydlltest设为当前活动工程。

  第六步:

  拷贝…/mydll/debug/mydll.dll 到 ../mydlltest/debug/下,拷贝…/mydll/debug/mydll.lib到…/mydlltest/目录下。

  第七步:

  在mydlltestView.cpp中的#endif下添加

  extern "C" __declspec(dllimport) int fun(int x1,int x2,int x3);

  在void CMydlltestView::OnDraw(CDC* pDC)中添加代码如下:

  void CMydlltestView::OnDraw(CDC* pDC)
   {
    CMydlltestDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    int x=fun(1,2,3);
    CString str;
    str.Format("%d",str);
    pDC->TextOut(10,10,x);
   }

  第八步:

  在WorkSpace中的mydlltest files上点击右键,选择Add files to Project ,将mydll.dll添加到工程。
好了,我们的工作做完了,运行一下看看吧!

  二、 类的添加和使用步骤:

  在mydll中生成一个新类,类的声明处改为class AFX_EXT_CLASS CMyClass ,在此类中和其他类一样添加自己需要的变量和函数,编译生成新的dll和lib,重复上面的第六步,在mydlltest中利用上面的方法生成一个myclass.h文件,拷贝mydll中myclass.h的所有代码到新生成的myclass.h中。在需要使用dll中CmyClass类的文件中包含myclass.h,然后我们就可以向其他类一样使用该类了。

  三、 字符串的定义和使用

  在mydll中定义字符串资源,编译生成新的dll和lib,重复上面的第六步,在mydlltest中的myclass.h中添加 #define IDS_MYSTR 1(假设我们定义的字符串资源的ID号为IDS_MYSTR),在需要是要该字符串的地方添加#include "myclass.h",即可使用该字符串了。

  CString str2;
  str2.LoadString(IDS_MYSTR);

  四、 对话框的定义和使用

  在mydll中定义对话框资源,生成一个新类CDlg,类的声明处改为class AFX_EXT_CLASS CDlg : public CDialog ,像其他对话框一样定义对话框的属性和功能,编译生成新的dll和lib,重复上面的第六步,在mydlltest中利用上面的方法生成一个dlg.h文件,拷贝mydll中dlg.h的所有代码到新生成的dlg.h中。在需要使用dll中此对话框资源的文件中包含dlg.h,然后我们就可以向其他对话框一样使用此对话框了。

  CDlg dlg;
  dlg.DoModal();

  好了,到这里我们所有的功能就都实现了,快编译运行一下吧!怎么样?还满意吗?

spring 源码解读与设计详解:1 框架搭建

从今天起,开始写一系列的对呀spring的源码的解读和设计详解的相关文章。开篇第一章,框架搭建。 1、官网下载spring所需的jar包等,地址:http://spring.io/   (projec...
  • sundenskyqq
  • sundenskyqq
  • 2015年01月31日 20:44
  • 2540

spring 源码解读与设计详解:2 BeanFactory

在spring的官网中我们看到,spring的产品已经发展的非常壮大,然而很多产品对于很多公司来讲用的非常少,甚至用不到。因此本系列的源码解读也不会涉及全部的spring的产品。而是只对spring的...
  • sundenskyqq
  • sundenskyqq
  • 2015年02月11日 15:15
  • 2253

MFC程序加载DLL文件时运行到Loadlibray()语句就无法继续下去

我在学习Detour时,为了进行测试,就建立了一个DLL文件和一个MFC工程。   但是我的MFC程序加载DLL文件时运行到Loadlibray(“XXX.dll”)这条语句就无法继续下去,没有报错...
  • u013147600
  • u013147600
  • 2015年05月04日 16:16
  • 671

spring 源码解读与设计详解:6 BeanDefinitionParserDelegate与资源解析

spring 源码解读与设计详解:6 BeanDefinitionParserDelegate与资源解析  spring 源码解读与设计详解:6 BeanDefinitionParserDelegat...
  • sundenskyqq
  • sundenskyqq
  • 2015年05月29日 21:04
  • 2102

什么是动态链接库

什么是dll: dll只是一组源代码的模块,每个模块包含一些可供应用程序或者其他dll调用的函数,在应用程序调用一个dll里面的函数的时候,操作系统会将dll的文件映像映射到进程的地址空间中,这...
  • u011392772
  • u011392772
  • 2016年09月10日 10:21
  • 278

静态链接库与动态链接库----C/C++

静态链接库和动态链接库
  • freestyle4568
  • freestyle4568
  • 2015年11月13日 17:18
  • 7794

在VS2010中创建和调用动态链接库和静态链接库

vs2010创建和调用动态链接库和静态链接库
  • yangghuannn
  • yangghuannn
  • 2016年01月13日 09:59
  • 5493

静态链接库与动态链接库区别

一、        静态链接库与动态链接库区别 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使...
  • u011404663
  • u011404663
  • 2016年02月25日 18:19
  • 1852

编译动态链接库.so和静态链接库.a

名词介绍 静态函数库 这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数...
  • lylwo317
  • lylwo317
  • 2016年05月02日 12:35
  • 1932

Windows 动态链接库 DLL 浅析

一、概念 DLL:Dynamic Link Library,即动态链接库,这种库包含了可由多个程序同时使用的代码和数据。 它是microsoft在windows操作系统中实现共享函数库概念的一种实现方...
  • heyabo
  • heyabo
  • 2013年03月26日 17:51
  • 27643
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:例程详析动态链接库
举报原因:
原因补充:

(最多只允许输入30个字)