📄 chap13.html
字号:
<P ALIGN="JUSTIFY"><LI>由于使用</FONT><FONT SIZE=3>__declspec(dllexport)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>关键字导出函数不需要编写</FONT><FONT SIZE=3>DEF</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>文件,因此,如果编写的</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>只供自己使用,使用</FONT><FONT SIZE=3>__declspec(dllexport)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>较为简单。</LI></P></UL>
<P ALIGN="JUSTIFY"> </P>
<UL>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>注意:</LI></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY"><LI>MFC</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>本身使用了</FONT><FONT SIZE=3>DEF</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>文件从</FONT><FONT SIZE=3>MFCx0.DLL</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>中导出函数和类。</LI></P></UL>
</FONT><FONT FACE="Arial"><P>13.2.2 </FONT><FONT FACE="黑体" LANG="ZH-CN">链接应用程序到</FONT><FONT FACE="Arial">DLL</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">同样,链接应用程序到</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>也有两种方法:</P>
<UL>
<P ALIGN="JUSTIFY"><LI>隐含链接</LI></P>
<P ALIGN="JUSTIFY"><LI>显式链接</LI></P></UL>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">隐含链接有时又称为静态加载。如果应用程序使用了隐含链接,操作系统在加载应用程序的同时加载应用程序所使用的</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。显式链接有时又称为动态加载。使用动态加载的应用程序必须在代码中明确的加载所使用的</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,并使用指针来调用</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的导出函数,在使用完毕之后,应用程序必须卸载所使用的</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="JUSTIFY">同一个</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>可以被应用程序隐含链接,也可以被显式链接,这取决于应用程序的目的和实现。</P>
<P ALIGN="JUSTIFY">下面我们在分别讲述两种不同的链接方式之后再作对比。</P><DIR>
</FONT><FONT FACE="Arial" SIZE=3><P>(1)	</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=3>使用隐含链接</P></DIR>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">在使用隐含链接除了需要相应的</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>文件外,还必须具备如下的条件:</P>
<UL>
<P ALIGN="JUSTIFY"><LI>一个包括导出的函数或</FONT><FONT SIZE=3>C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类的头文件</LI></P>
<P ALIGN="JUSTIFY"><LI>一个输入库文件(</FONT><FONT SIZE=3>.LIB</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>文件)</LI></P></UL>
<P ALIGN="JUSTIFY">通常情况下,我们需要从</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的提供者那里得到上面的文件。输入库文件是在</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>文件被链接时由链接程序生成的。</P>
<P ALIGN="JUSTIFY">在“</FONT><FONT SIZE=3>13.2.1 DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的结构和导出方式”中所创建的</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</FONT><FONT SIZE=3>msgbox.dll</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所对应的头文件</FONT><FONT SIZE=3>msgbox.h</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>#include <windows.h></P>
<P>extern "C" __declspec(dllimport) int MsgBox(</P>
<P>	// 消息框的文本</P>
<P>	LPCTSTR lpText="虽然这个例子有一些幼稚,但它工作得非常的好!",</P>
<P>	// 消息框的标题</P>
<P>	LPCTSTR lpCaption="一个简单的例子",</P>
<P>	// 消息框的样式</P>
<P>	UINT uType=MB_OK);</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">需要注意的是,这个</FONT><FONT SIZE=3>msgbox.h</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>文件和创建</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>时所使用</FONT><FONT SIZE=3>msgbox.h</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是不同的,唯一的差别在于,创建</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>时的</FONT><FONT SIZE=3>msgbox.h</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中使用的是</FONT><FONT SIZE=3>__declspec(dllexport)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>关键字,而供应用程序所使用的</FONT><FONT SIZE=3>msgbox.h</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中使用的是</FONT><FONT SIZE=3>__declspec(dllimport)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>关键字。无论创建</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>时使用的是</FONT><FONT SIZE=3>DEF</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>文件还是</FONT><FONT SIZE=3>__declspec(dllexport)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>关键字,均可使用</FONT><FONT SIZE=3>__declspec(dllimport)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>关键字从</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中引入函数。引入函数时也可以省略</FONT><FONT SIZE=3>__declspec(dllimport)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>关键字,但是使用它可以使编译器生成效率更高的代码。</P>
<UL>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>注意:</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>如果需要引入的是</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>中的公用数据和对象,则必须使用</FONT><FONT SIZE=3>__declspec(dllimport)</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>关键字。</LI></P></UL>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">现在使用</FONT><FONT SIZE=3>Microsoft Developer Studio</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>创建一个</FONT><FONT SIZE=3>Win32 Application</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>工程,命名为</FONT><FONT SIZE=3>tester</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。向工程中添加一个</FONT><FONT SIZE=3>C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>源文件,如</FONT><FONT SIZE=3>tester.cpp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。在</FONT><FONT SIZE=3>tester.cpp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>文件中输入下面的代码:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>#include "msgbox.h"		// 应将msgbox.h文件拷贝到工程tester的目录下。</P>
<P>int WINAPI WinMain(HINSTANCE hInstance,</P>
<P>				 HINSTANCE hPrevInstance,</P>
<P>				 LPSTR lpCmdLine,</P>
<P>				 int nCmdShow)</P>
<P>{</P>
<P>	return MsgBox();</P>
<P>}</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">在上面的代码中,</FONT><FONT SIZE=3>MsgBox()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数的所有参数都使用了缺省值。</P>
<UL>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>注意:</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>在编译之前,将上一步生成的</FONT><FONT SIZE=3>msgbox.lib</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>文件拷贝到</FONT><FONT SIZE=3>tester</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>工程所在的目录下。然后单击菜单项</FONT><FONT SIZE=3>Project|Settings...</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>,将</FONT><FONT SIZE=3>msgbox.lib</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>添加到</FONT><FONT SIZE=3>Link</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>选项卡下的</FONT><FONT SIZE=3>Object/library modules</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>文本框中。如果忽略这一步,链接时将会导致错误。完成之后创建该应用程序。</LI></P></UL>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -