📄 例程详析动态链接库.htm
字号:
display:none;mso-hide:all;mso-font-kerning:0pt'><o:p> </o:p></span></p>
<div align=center>
<table class=MsoNormalTable border=0 cellspacing=0 cellpadding=0 width="96%"
style='width:96.0%;mso-cellspacing:0cm;mso-padding-alt:0cm 0cm 0cm 0cm'>
<tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes;height:3.0pt'>
<td colspan=3 style='padding:0cm 0cm 0cm 0cm;height:3.0pt'>
<p class=MsoNormal align=left style='text-align:left;mso-pagination:widow-orphan'><span
lang=EN-US style='font-size:3.0pt;mso-bidi-font-size:9.0pt;font-family:宋体;
mso-bidi-font-family:宋体;mso-font-kerning:0pt'><o:p> </o:p></span></p>
</td>
</tr>
<tr style='mso-yfti-irow:1;mso-yfti-lastrow:yes'>
<td valign=top style='padding:0cm 0cm 0cm 0cm' id=fontzoom>
<p class=MsoNormal align=left style='text-align:left;line-height:15.0pt;
mso-pagination:widow-orphan'><span lang=EN-US style='font-size:10.0pt;
font-family:宋体;mso-bidi-font-family:宋体;mso-font-kerning:0pt'><o:p> </o:p></span></p>
<p class=MsoNormal align=left style='text-align:left;line-height:15.0pt;
mso-pagination:widow-orphan'><span style='font-size:10.0pt;font-family:宋体;
mso-bidi-font-family:宋体;mso-font-kerning:0pt'>动态链接库(<span lang=EN-US>DLL,</span>即<span
lang=EN-US> Dynamic-Link Library</span>)是可执行的模块,但它没有自己的堆栈,必须在调用动态链接库函数的程序环境下运行。动态链接库不仅可以作为一个运行模块,包括函数代码,而且可以包含程序以外的任何数据或资源(位图、图标等等)。动态链接库就是给应用程序提供函数或者资源。<span
lang=EN-US> <br>
<br>
</span> 动态链接与静态链接是相对立的。静态链接的时候,可执行程序内包含了所访问的函数的代码,可执行程序占用的空间较大;但运行时,不需要其他模块支持,从而速度相对较快。动态链接的可执行程序中不包含动态访问的函数代码,仅仅包含对它的参考,运行时需要其他模块(<span
lang=EN-US>DLL</span>)的支持,速度相对较慢。<span lang=EN-US> <br>
<br>
</span> 动态链接库是<span lang=EN-US>Windows</span>的一种极其重要的技术。它使得开发人员可以通过编写动态链接库,方便灵活的实现大型程序的开发,按自己的意愿对操作系统进行扩展。<span
lang=EN-US> <br>
<br>
</span> 下面通过例子介绍如何在动态链接库中定义函数、资源、和类以及如何在工程中使用动态链接库中已定义的函数、资源、类。<span
lang=EN-US> <br>
<br>
</span> 一、 函数的定义和使用方法:<span lang=EN-US> <br>
<br>
</span> 第一步:<span lang=EN-US> <br>
<br>
</span> 运行<span lang=EN-US>AppWizard</span>,定义项目名为<span lang=EN-US>mydll</span>,选择<span
lang=EN-US>MFC AppWizard(dll),</span>而不是<span lang=EN-US>MFC AppWizards(exe)</span>。<span
lang=EN-US> <br>
<br>
</span> 第二步:<span lang=EN-US> <br>
<br>
</span> 在这个例子中,只有一个<span lang=EN-US>AppWizard</span>屏幕出现,选择<span
lang=EN-US>MFC</span>扩展<span lang=EN-US>DLL(MFC Extension DLL (using shared
MFC DLL),</span>点击<span lang=EN-US>FINISH</span>生成工程。<span lang=EN-US> <br>
<br>
</span> 第三步:<span lang=EN-US> <br>
<br>
</span> 点击<span lang=EN-US>File</span>中的<span lang=EN-US>New</span>,选择<span
lang=EN-US>C/C Header File</span>,<span lang=EN-US>File Name</span>中输入<span
lang=EN-US>dll,</span>点击<span lang=EN-US>OK</span>,创建<span lang=EN-US>dll.h</span>。输入<span
lang=EN-US>extern "C" __declspec(dllexport) int fun(int x1,int
x2,int x3); </span>,保存。<span lang=EN-US> <br>
<br>
</span> 第四步:<span lang=EN-US> <br>
<br>
</span> 点击<span lang=EN-US>File</span>中的<span lang=EN-US>New</span>,选择<span
lang=EN-US>C Source File</span>,<span lang=EN-US>File Name</span>中输入<span
lang=EN-US>dll,</span>点击<span lang=EN-US>OK</span>,创建<span lang=EN-US>dll.cpp</span>。输入<span
lang=EN-US> <br>
<br>
</span> <span lang=EN-US>#include "stdafx.h" <br>
</span> <span lang=EN-US>#include "dll.h" <br>
</span> <span lang=EN-US>extern "C" __declspec(dllexport) int
fun(int x1,int x2,int x3) <br>
</span> <span lang=EN-US>{ <br>
</span> <span lang=EN-US>return x1 x2 x3; <br>
</span> <span lang=EN-US>} <br>
<br>
</span> 编译生成<span lang=EN-US>mydll.dll</span>和<span lang=EN-US>mydll.lib</span>。<span
lang=EN-US> <br>
<br>
</span> 第五步:<span lang=EN-US> <br>
<br>
</span> 选择<span lang=EN-US>Project </span>中<span lang=EN-US>Add To Project </span>中的<span
lang=EN-US>New , </span>重新生成一个工程,选择<span lang=EN-US>MFC AppWizards(exe)</span>,项目名为<span
lang=EN-US>mydlltest , </span>选择<span lang=EN-US>Single Document ,</span>点击<span
lang=EN-US>FINISH</span>,生成一个新的工程。选择菜单中的<span lang=EN-US>Project àSet Active
Project àmydlltest ,</span>将<span lang=EN-US>mydlltest</span>设为当前活动工程。<span
lang=EN-US> <br>
<br>
</span> 第六步:<span lang=EN-US> <br>
<br>
</span> 拷贝<span lang=EN-US>…\mydll\debug\mydll.dll </span>到<span lang=EN-US>
..\mydlltest\debug\</span>下,拷贝<span lang=EN-US>…\mydll\debug\mydll.lib</span>到<span
lang=EN-US>…\mydlltest\</span>目录下。<span lang=EN-US> <br>
<br>
</span> 第七步:<span lang=EN-US> <br>
<br>
</span> 在<span lang=EN-US>mydlltestView.cpp</span>中的<span lang=EN-US>#endif</span>下添加<span
lang=EN-US> <br>
<br>
</span> <span lang=EN-US>extern "C" __declspec(dllimport) int
fun(int x1,int x2,int x3); <br>
<br>
</span> 在<span lang=EN-US>void CMydlltestView::OnDraw(CDC* pDC)</span>中添加代码如下:<span
lang=EN-US> <br>
<br>
</span> <span lang=EN-US>void CMydlltestView::OnDraw(CDC* pDC) <br>
</span> <span lang=EN-US>{ <br>
</span> <span lang=EN-US>CMydlltestDoc* pDoc = GetDocument(); <br>
</span> <span lang=EN-US>ASSERT_VALID(pDoc); <br>
</span> <span lang=EN-US>// TODO: add draw code for native data here <br>
</span> <span lang=EN-US>int x=fun(1,2,3); <br>
</span> <span lang=EN-US>CString str; <br>
</span> <span lang=EN-US>str.Format("%d",str); <br>
</span> <span lang=EN-US>pDC->TextOut(10,10,x); <br>
</span> <span lang=EN-US>} <br>
<br>
</span> 第八步:<span lang=EN-US> <br>
<br>
</span> 在<span lang=EN-US>WorkSpace</span>中的<span lang=EN-US>mydlltest files</span>上点击右键,选择<span
lang=EN-US>Add files to Project ,</span>将<span lang=EN-US>mydll.dll</span>添加到工程。<span
lang=EN-US> <br>
</span>好了,我们的工作做完了,运行一下看看吧!<span lang=EN-US> <br>
<br>
</span> 二、 类的添加和使用步骤:<span lang=EN-US> <br>
<br>
</span> 在<span lang=EN-US>mydll</span>中生成一个新类,类的声明处改为<span lang=EN-US>class
AFX_EXT_CLASS CMyClass </span>,在此类中和其他类一样添加自己需要的变量和函数,编译生成新的<span lang=EN-US>dll</span>和<span
lang=EN-US>lib,</span>重复上面的第六步,在<span lang=EN-US>mydlltest</span>中利用上面的方法生成一个<span
lang=EN-US>myclass.h</span>文件,拷贝<span lang=EN-US>mydll</span>中<span
lang=EN-US>myclass.h</span>的所有代码到新生成的<span lang=EN-US>myclass.h</span>中。在需要使用<span
lang=EN-US>dll</span>中<span lang=EN-US>CmyClass</span>类的文件中包含<span
lang=EN-US>myclass.h</span>,然后我们就可以向其他类一样使用该类了。<span lang=EN-US> <br>
<br>
</span> 三、 字符串的定义和使用<span lang=EN-US> <br>
<br>
</span> 在<span lang=EN-US>mydll</span>中定义字符串资源,编译生成新的<span lang=EN-US>dll</span>和<span
lang=EN-US>lib,</span>重复上面的第六步,在<span lang=EN-US>mydlltest</span>中的<span
lang=EN-US>myclass.h</span>中添加<span lang=EN-US> #define IDS_MYSTR 1</span>(假设我们定义的字符串资源的<span
lang=EN-US>ID</span>号为<span lang=EN-US>IDS_MYSTR</span>),在需要是要该字符串的地方添加<span
lang=EN-US>#include "myclass.h"</span>,即可使用该字符串了。<span lang=EN-US> <br>
<br>
</span> <span lang=EN-US>CString str2; <br>
</span> <span lang=EN-US>str2.LoadString(IDS_MYSTR); <br>
<br>
</span> 四、 对话框的定义和使用<span lang=EN-US> <br>
<br>
</span> 在<span lang=EN-US>mydll</span>中定义对话框资源,生成一个新类<span lang=EN-US>CDlg</span>,类的声明处改为<span
lang=EN-US>class AFX_EXT_CLASS CDlg : public CDialog </span>,像其他对话框一样定义对话框的属性和功能,编译生成新的<span
lang=EN-US>dll</span>和<span lang=EN-US>lib,</span>重复上面的第六步,在<span lang=EN-US>mydlltest</span>中利用上面的方法生成一个<span
lang=EN-US>dlg.h</span>文件,拷贝<span lang=EN-US>mydll</span>中<span lang=EN-US>dlg.h</span>的所有代码到新生成的<span
lang=EN-US>dlg.h</span>中。在需要使用<span lang=EN-US>dll</span>中此对话框资源的文件中包含<span
lang=EN-US>dlg.h</span>,然后我们就可以向其他对话框一样使用此对话框了。<span lang=EN-US> <br>
<br>
</span> <span lang=EN-US>CDlg dlg; <br>
</span> <span lang=EN-US>dlg.DoModal()</span>;<span lang=EN-US> <br>
<br>
</span> 好了,到这里我们所有的功能就都实现了,快编译运行一下吧!怎么样?还满意吗?<span lang=EN-US><o:p></o:p></span></span></p>
</td>
<td style='padding:0cm 0cm 0cm 0cm'>
<p class=MsoNormal align=left style='text-align:left;mso-pagination:widow-orphan'><span
lang=EN-US style='font-size:10.0pt;mso-font-kerning:0pt'><o:p> </o:p></span></p>
</td>
<td style='padding:0cm 0cm 0cm 0cm'>
<p class=MsoNormal align=left style='text-align:left;mso-pagination:widow-orphan'><span
lang=EN-US style='font-size:10.0pt;mso-font-kerning:0pt'><o:p> </o:p></span></p>
</td>
</tr>
</table>
</div>
<p class=MsoNormal><span lang=EN-US><o:p> </o:p></span></p>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -