⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap9_3.htm

📁 着重介绍基于C++的web编程技术
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<html>

<head>
<title>9.3创建动态连接库</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>

<body link="#3973DE" alink="#3973DE">
<font SIZE="5"><b><div align="center"><center>

<table border="0" width="615" cellspacing="0" cellpadding="0">
  <tr>
    </b><td><div align="center"><center><table border="0" width="615" cellpadding="0" cellspacing="0" height="20">
      <tr>
        <td width="377" bgcolor="#15397D" height="20"></td>
        <td width="238" bgcolor="#000000" height="20"><p align="right"></font><span style="text-decoration: none"><a href="../../index.htm"><font color="#FFFFFF">电脑报Visual 
        C++网络教程</font></a></span></td>
      </tr>
    </table>
    </center></div><font FACE="Times New Roman" SIZE="4"><b><p ALIGN="CENTER"></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="4">9.3</font><font SIZE="4" color="#3973DE">创建动态连接库</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">在一些情况下,必须使用动态连接库:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>1.</font><font SIZE="3">多个应用程序共享代码和数据:比如</font><font FACE="Times New Roman" SIZE="3">Office</font><font SIZE="3">软件的各个组成部分有相似的外观和功能,这就是通过共享动态连接库实现的。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>2.</font><font SIZE="3">在钩子程序过滤系统消息时必须使用动态连接库</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>3.</font><font SIZE="3">设备驱动程序必须是动态连接库</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>4.</font><font SIZE="3">如果要在对话框编辑器中使用自己定义的控件,也必须使用动态连接库</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>5.</font><font SIZE="3">动态连接库以一种自然的方式将一个大的应用程序划分为几个小的模块,有利于小组内部成员的分工与合作。而且,各个模块可以独立升级。如果小组中的一个成员开发了一组实用例程,他就可以把这些例程放在一个动态连接库中,让小组的其他成员使用。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>6.</font><font SIZE="3">为了实现应用程序的国际化,往往需要使用动态连接库。使用动态连接库可以将针对某一国家、语言的信息存放在其中。对于不同的版本,使用不同的动态连接库。在使用</font><font FACE="Times New Roman" SIZE="3">AppWizard</font><font SIZE="3">生成应用程序时,我们可以指定资源文件使用的语言,这就是通过提供不同的动态连接库实现的。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>MFC</font><font SIZE="3">支持两类动态连接库的创建:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">用户动态连接库</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>MFC</font><font SIZE="3">扩展类库。</font><font FACE="Times New Roman"><b></p>
    <p></b></font><font color="#3973DE" FACE="Times New Roman">9.3.1</font><font color="#3973DE">用户动态连接库(<font FACE="Times New Roman">_USRDLL</font>)</font></p>
    <p><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">用户动态连接库一般使用</font><font FACE="Times New Roman" SIZE="3">C</font><font SIZE="3">语言接口。要创建一个动态连接库,选择</font><font FACE="Times New Roman" SIZE="3">File-&gt;New</font><font SIZE="3">菜单,弹出</font><font FACE="Times New Roman" SIZE="3">New</font><font SIZE="3">对话框。在</font><font FACE="Times New Roman" SIZE="3">Projects</font><font SIZE="3">标签页下,选择“</font><font FACE="Times New Roman" SIZE="3">Win32 Dynamic-Link Library</font><font SIZE="3">”。</font><font FACE="Times New Roman" SIZE="3">Visual C++</font><font SIZE="3">就会创建动态连接库所需的工程文件和</font><font FACE="Times New Roman" SIZE="3">MAK</font><font SIZE="3">文件。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">然后把下面两个文件加入到工程中(</font><font FACE="Times New Roman" SIZE="3">Project-Add to Project-Files</font><font SIZE="3">菜单)。</p>
    <p>文件</font><font FACE="Times New Roman" SIZE="3">1</font><font SIZE="3">:</font><font FACE="Times New Roman" SIZE="3">mymaths.cpp</p>
    <p>////////////////////////////</p>
    <p>//mymaths.cpp</p>
    <p>//</p>
    <p>//a maths API DLL.</p>
    <p>//</p>
    <p>///////////////////////////</p>
    <p>#include&lt;windows.h&gt;</p>
    <p>//Declare the DLL functions prototypes</p>
    <p>int Summary(int);</p>
    <p>int Factorial(int);</p>
    <p>//////////////////////////</p>
    <p>//DllEntryPoint():The entry point of the DLL</p>
    <p>//</p>
    <p>/////////////////////////</p>
    <p>BOOL WINAPI DLLEntryPoint(HINSTANCE hDLL,DWORD dwReason,</p>
    <p>LPVOID Reserved)</p>
    <p>{</p>
    <p>switch(dwReason)</p>
    <p>{</p>
    <p>case DLL_PROCESS_ATTACH:</p>
    <p>{</p>
    <p>//</font><font SIZE="3">一些初始化代码</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>break;</p>
    <p>}</p>
    <p>case DLL_PROCESS_DETACH:</p>
    <p>{</p>
    <p>//</font><font SIZE="3">一些用于清理的代码</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>break;</p>
    <p>}</p>
    <p>}</p>
    <p>return TRUE;</p>
    <p>}</p>
    <p>int Summary(int n)</p>
    <p>{</p>
    <p>int sum=0;</p>
    <p>int i;</p>
    <p>for(i=1;i&lt;=n;i++)</p>
    <p>{</p>
    <p>sum+=i;</p>
    <p>}</p>
    <p>return sum;</p>
    <p>}</p>
    <p>int Factorial(int n)</p>
    <p>{</p>
    <p>int Fact=1;</p>
    <p>int i;</p>
    <p>for(i=1;i&lt;=n;i++)</p>
    <p>{</p>
    <p>Fact=Fact*i;</p>
    <p>}</p>
    <p>return Fact;</p>
    <p>}</font><font SIZE="3"></p>
    <p>文件</font><font FACE="Times New Roman" SIZE="3">2</font><font SIZE="3">:</font><font FACE="Times New Roman" SIZE="3">mymaths.def</p>
    <p>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</p>
    <p>;Mymaths.DEF</p>
    <p>;</p>
    <p>;The DEF file for the Mymaths.DLL DLL.</p>
    <p>;</p>
    <p>LIBRARY mymaths</p>
    <p>CODE PRELOAD MOVEABLE DISCARDABLE</p>
    <p>DATA PRELOAD SINGLE</p>
    <p>EXPORTS</p>
    <p>;The names of the DLL functions</p>
    <p>Summary</p>
    <p>Factorial</p>
    <p></font><font SIZE="3">在文件</font><font FACE="Times New Roman" SIZE="3">mymaths.cpp</font><font SIZE="3">开头,声明了动态连接库所包含的两个函数:</font><font FACE="Times New Roman" SIZE="3">Summary</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">Factorial</font><font SIZE="3">。接着是</font><font FACE="Times New Roman" SIZE="3">DllEntryPoint()</font><font SIZE="3">函数的定义。</font><font FACE="Times New Roman" SIZE="3">DllEntryPoint()</font><font SIZE="3">顾名思义是动态连接库的入口,应用程序通过该入口访问动态连接库提供的服务。</font><font FACE="Times New Roman" SIZE="3">DllEntryPoint()</font><font SIZE="3">主体是一个</font><font FACE="Times New Roman" SIZE="3">switch/case</font><font SIZE="3">语句:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>switch(dwReason)</p>
    <p>{</p>
    <p>case DLL_PROCESS_ATTACH:</p>
    <p>{</p>
    <p>//</font><font SIZE="3">一些初始化代码</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>break;</p>
    <p>}</p>
    <p>case DLL_PROCESS_DETACH:</p>
    <p>{</p>
    <p>//</font><font SIZE="3">一些用于清理的代码</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>break;</p>
    <p>}</p>
    <p>}</p>
    <p></font><font SIZE="3">其中,在</font><font FACE="Times New Roman" SIZE="3">case 
    DLL_PROCESS_ATTACH</font><font SIZE="3">分支可加入动态连接库执行时的一些初始化代码。在</font><font FACE="Times New Roman" SIZE="3">case DLL_PROCESS_DETACH</font><font SIZE="3">加入动态连接库被卸载时的一些清理代码,比如释放动态连接库运行时申请的内存等。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">在</font><font FACE="Times New Roman" SIZE="3">DllEntryPoint()</font><font SIZE="3">函数后,是两个函数</font><font FACE="Times New Roman" SIZE="3">Summary</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">Factorial</font><font SIZE="3">函数的定义。它们的定义与前面的静态库完全相同。在这里用户可以放入任何函数。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">另外,我们还需要一个</font><font FACE="Times New Roman" SIZE="3">mymaths.def</font><font SIZE="3">文件。这个文件记录了可被外部应用程序使用的</font><font FACE="Times New Roman" SIZE="3">DLL</font><font SIZE="3">库函数名字。这些名字信息和对应的函数位置的信息将被编译进动态连接库文件中,然后应用程序根据函数名字和函数位置对照表来找到对应的函数。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">按</font><font FACE="Times New Roman" SIZE="3">F7</font><font SIZE="3">编译工程,</font><font FACE="Times New Roman" SIZE="3">Visual C++</font><font SIZE="3">就在</font><font FACE="Times New Roman" SIZE="3">mymaths\debug</font><font SIZE="3">目录下生成一个</font><font FACE="Times New Roman" SIZE="3">mymaths.dll</font><font SIZE="3">动态连接库文件。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">现在,我们来使用刚才生成的动态连接库。我们并不重新生成一个程序,而是修改前面测试静态库时的</font><font FACE="Times New Roman" SIZE="3">test</font><font SIZE="3">程序。首先,把</font><font FACE="Times New Roman" SIZE="3">mymaths\debug</font><font SIZE="3">目录下的</font><font FACE="Times New Roman" SIZE="3">mymaths.dll</font><font SIZE="3">拷贝到</font><font FACE="Times New Roman" SIZE="3">test\debug</font><font SIZE="3">目录下。</font><font FACE="Times New Roman" SIZE="3">test</font><font SIZE="3">程序运行时,会在该目录下搜索动态连接库文件。然后修改</font><font FACE="Times New Roman" SIZE="3">testdlg.h</font><font SIZE="3">,在其中加入一个函数</font><font FACE="Times New Roman" SIZE="3">LoadDLL()</font><font SIZE="3">的声明,见清单</font><font FACE="Times New Roman" SIZE="3">9.4</font><font SIZE="3">。</font><font FACE="Times New Roman" SIZE="3">LoadDLL</font><font SIZE="3">用于载入动态连接库。<b></p>
    <p>清单</font><font FACE="Times New Roman" SIZE="3">9.4 </font><font SIZE="3">修改后的对话框头文件</font></b><font FACE="Times New Roman" SIZE="3"></p>
    <p>class CTestDlg : public CDialog</p>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -