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

📄 chap05.htm

📁 C++教程
💻 HTM
字号:
<html>

<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=gb2312">
<meta NAME="GENERATOR" CONTENT="Microsoft FrontPage 3.0">
<title>动态链结函式库(DLL-Dynamic Linked Library) </title>
<link rel="stylesheet" href="../../../include/style.css">
</head>

<body>
<font SIZE="2">

<p><small><a href="../../../index.htm">首页</a> &gt;&gt; <a href="../../program.htm">程序设计</a> 
  &gt;&gt; <a href="../cbuilder.htm">C++ Builder</a>&nbsp; &gt;&gt;&nbsp; </small>动态链结函式库(DLL-Dynamic 
  Linked Library)</p>

<p align="left"><!--webbot bot="ImageMap" rectangle=" (40,1) (71, 23)  chap51.htm" rectangle=" (4,1) (36, 23)  ../ch4/chap43.htm" src="../ch1/NextBack.gif" width="72" height="24" alt="NextBack.gif (743字节)" border="0" startspan --><MAP NAME="FrontPageMap"><AREA SHAPE="RECT" COORDS="40, 1, 71, 23" HREF="chap51.htm"><AREA SHAPE="RECT" COORDS="4, 1, 36, 23" HREF="../ch4/chap43.htm"></MAP><a href="../../../_vti_bin/shtml.exe/program/C++/ch5/chap05.htm/map"><img ismap usemap="#FrontPageMap" border="0" height="24" alt="NextBack.gif (743字节)" src="../ch1/NextBack.gif" width="72"></a><!--webbot bot="ImageMap" endspan i-checksum="38442" --></p>
</font>

<p align="center"><strong><font size="3">动态链结函式库(DLL-Dynamic Linked 
Library) </font></strong></p>

<p align="left"><font SIZE="2" color="#FF0000">前言</font></p>

<p><font SIZE="2">本章要介绍的是动态链结函式库(Dynamic Linked Library,简称DLL)的撰写、使用及相关主题。动态链结函式库是Windows程式设计的一门重要领域,不信的话,你可以看看在Windows系统目录下那些数量庞大的 
.DLL档案,它的重要性及使用频率由此可见一般。</font></p>

<p><font SIZE="2">基本上,如果略去VCL软体元件不谈的话,在C++Builder中撰写及使用DLL的方法是和传统Windows 
SDK是一致的,然而如此一来C++Builder也就失去了它傲人的优势了。因此在本章中我会为你介绍如何撰写使用VCL元件的 
DLL,同时也针对各种不同程式发展平台如Visual C++, VB之间的DLL使用上应注意的事项,做一个全面的探讨。 
</font></p>

<p><font SIZE="2">以C++Builder撰写动态链结函式库 (DLL)<br>
</font></p>

<p><img SRC="IMG00001.GIF" WIDTH="466" HEIGHT="269"><font SIZE="2">图一 以C++Builder撰写的About 
Dialog</font></p>

<p><font SIZE="2">图一所展示的就是我所要撰写的一个以VCL元件组合而成的About 
Dialog,如何?看起来是不是颇具商业软体架势呢?</font></p>

<p><font SIZE="2">C++Builder由於其先天上的优势,因此在视觉化的程式设计领域游刃有馀。然而在现实的工作环境中,也许在你手中的专案并非使用C++Builder来撰写,而是以其他程式工具如Visual 
C++,VB或是Borland C++完成的,如果要全部改写原来的程式,不仅旷日废时,而且可能老板也不允许,那麽该怎麽办呢?对了,就是利用撰写DLL的途径来达到程式共享的目的,为了要让传统的Windows 
SDK程式设计人员也可以享受此一优势,因此你可以将部份视觉程式设计部份以DLL完成,然後提供外部函式供他人呼叫,如此你就可以兼顾两者,『执其两端,用於其中』,而顺利地解决问题了。 
</font></p>

<p><font SIZE="2">好了!废话不多说了,现在开始进入正题吧!</font></p>

<p><font SIZE="2" color="#FF0000">建立DLL专案</font></p>

<p><font SIZE="2">建立DLL专案的方式和一般应用程式大致相同。同样地你可以由 
【File/New】来建立一个新的专案,然後选择DLL类型的专案。</font> </p>

<p><font SIZE="2">如图二所示:</font></p>

<p><img SRC="IMG00002.GIF" WIDTH="432" HEIGHT="284"> </p>

<p><font SIZE="2">图二 选择DLL专案类型</font></p>

<p><font SIZE="2">建选择完专案类型之後,它就自动为你产生了相关档案。和应用程式不同的是,它只产生了一个Project档,而不包含表格档,而该档案只是一个包含DLL进入点程式的空壳子,程式大致如下: 
</font></p>

<p><font SIZE="2">int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)</font> 
</p>

<p><font SIZE="2">{</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; return 1;</font> </p>

<p><font SIZE="2">}</font></p>

<p><font SIZE="2">DllEntryPoint是DLL内定的程式进入点,因为本程式中并不做任何处理,所以就直接return 
1了。</font></p>

<p><font SIZE="2">加入TForm表格</font></p>

<p><font SIZE="2">为了要撰写如图一的About Dialog,毫无疑问地,我们必须加入一个TForm表格,因为建立DLL专案时,并未自动产生相关的TForm表格,所以你必须以手动方式加入。此时你可以【File/New 
Form】来加入一个表格。再来我们就可以用和一般应用程式设计相同的方式,加入必要的软体元件,如图叁所示。</font></p>

<p><img SRC="IMG00003.GIF" WIDTH="465" HEIGHT="291"> </p>

<p><font SIZE="2">图叁 在设计时期(Design Time)的 TForm。</font></p>

<p><font SIZE="2">你可以看到,我在程式中使用了叁个TPanel元件(除了标出来的之外,另外还有一个用来作为放置所有元件的平台)。以及一个TImage元件,图叁个的叁个Panel元件的样子都不同,那是利用修改其 
BevelInner,BevelOuter,BevelWidth来达成的,你可以试着去修改它,看看能否做出更好的效果。至於TImage是用来做为显示那张雅典娜图形的元件。</font></p>

<p><font SIZE="2">在安排好了所有元件的位置之後,我们再设定所有元件的OnClick事件处理函式,让它可以在使用者按下滑鼠时,关掉该交谈窗。这个事件处理函式很简单,只有短短的一行。 
</font></p>

<p><font SIZE="2">void __fastcall TForm1::Image1Click(TObject *Sender)</font> </p>

<p><font SIZE="2">{</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; Close();</font> </p>

<p><font SIZE="2">}</font></p>

<p><font SIZE="2">好了,至此我们已完成加入表格的程序。</font></p>

<p><font SIZE="2" color="#FF0000">撰写输出函式(Export Function)</font></p>

<p><font SIZE="2">在完成的表格的设计後,再来我们就要撰写输出函式,该外部程式可以利用呼叫该函式的方式显示这个表格。我们的输出函式定义如下:</font></p>

<p><font SIZE="2">extern &quot;C&quot; void _stdcall ShowImage(void); </font></p>

<p><font SIZE="2">其中 extern &quot;C&quot; 是用来告诉编译器,以C的方式来命名,而不要以C++ 
的命名法,因为C++ 
的命名法会在函式名称後加上参数型态等装饰字,如此会造成其他程式如VC++,VB等无法使用的困扰。另外 
__stdcall是用来表示它使用的参数传入方法。我们在後续单元会针对以上两者做更为深入的介绍。 
</font></p>

<p><font SIZE="2">再来我们来看函式本身,这个函式很简单,只是利用new动态产生一个表格,然後利用ShowModal来显示该表格,ShowModal会一直等到使用者按Click之後才关掉表格,此时我们再以delete指令来释放占用的记忆体。 
</font></p>

<p><font SIZE="2">void _export _stdcall ShowImage(void)</font> </p>

<p><font SIZE="2">{</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; Form1 = new TForm1(NULL);</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; Form1-&gt;ShowModal();</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; delete Form1;</font> </p>

<p><font SIZE="2">}</font></p>

<p><font SIZE="2">在完成以上程式之後,你就可以编译程式。此时C++Builder会产生一个DLL档,以本程式而言,它会产生一个DLLSAMP.DLL档案,而这个就是供外部呼叫的动态链结函式库。 
</font></p>

<p><font SIZE="2" color="#FF0000">在C++Builder中使用DLL</font></p>

<p><font SIZE="2">再来我要告诉你如何使用动态链结函式库。我们以前面所产生的DLL为例。使用DLL有两种方式,分别为明确呼叫及不明确呼叫。</font></p>

<p><font SIZE="2">我先说明不明确呼叫的使用方式。不明确呼叫指的是,在程式中并没有一行程式是用来载入DLL,而是利用链结一个记载输入函式的函式库档案(LIB),来进行链结,如此系统会自动将该DLL载入,同时在使用完毕後将其释放,不必由使用者(也就是呼叫它的函式)来进行载入及释放的动作。 
</font></p>

<p><font SIZE="2">首先必须产生一个LIB档,你可以利用C++Builder程式目录内的IMPLIB.EXE来产生该档案,切忌勿使用Visual 
C++ 的IMPLIB.EXE,因为Microsoft所使用的格式是COFF格式的LIB档,而Borland所使用的格式是OMF格式的LIB档。(同样地,若是你的LIB档是要给Visual 
C++ 链结用的,那就要使用它所附的IMPLIB.EXE,在使用时不可不察)。因此我们可用以下指令产生DLLSAMP.LIB档。 
</font></p>

<p><font SIZE="2">IMPLIB DLLSAMP.LIB DLLSAMP.DLL</font></p>

<p><font SIZE="2">如此你就可以得到供程式链结用DLLSAMP.LIB档了。</font></p>

<p><font SIZE="2">接着我们来撰写使用该DLL的范例程式。这个程式相当简单,我只在表格中放置一个Button,然後撰写该Button的OnClick事件处理函式,使其呼叫ShowImage函式即可。 
</font></p>

<p><font SIZE="2">有一点要注意的是,你必须将先前产生的DLLSAMP.LIB加入此专案中,利用 
【Project/Add to Project】选择LIB型态档案,即可将其加入。</font></p>

<p><font SIZE="2">最後我们就可以链结程式,以下为其执行结果。</font> </p>

<p><img SRC="IMG00004.GIF" WIDTH="462" HEIGHT="374"> </p>

<p><font SIZE="2">图四 执行结果。</font></p>

<p align="right"><font SIZE="2"><!--webbot bot="ImageMap" rectangle=" (40,1) (71, 23)  chap51.htm" rectangle=" (4,1) (36, 23)  ../ch4/chap43.htm" src="../ch1/NextBack.gif" width="72" height="24" alt="NextBack.gif (743字节)" border="0" startspan --><MAP NAME="FrontPageMap1"><AREA SHAPE="RECT" COORDS="40, 1, 71, 23" HREF="chap51.htm"><AREA SHAPE="RECT" COORDS="4, 1, 36, 23" HREF="../ch4/chap43.htm"></MAP><a href="../../../_vti_bin/shtml.exe/program/C++/ch5/chap05.htm/map1"><img ismap usemap="#FrontPageMap1" border="0" height="24" alt="NextBack.gif (743字节)" src="../ch1/NextBack.gif" width="72"></a><!--webbot bot="ImageMap" endspan i-checksum="11517" --></font></p>

<p><font SIZE="2"><small><a href="../../../index.htm">首页</a> &gt;&gt; <a href="../../program.htm">程序设计</a> 
  &gt;&gt; <a href="../cbuilder.htm">C++ Builder</a>&nbsp; &gt;&gt;&nbsp; </small>动态链结函式库(DLL-Dynamic 
  Linked Library)</font></p>
</body>
</html>

⌨️ 快捷键说明

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