📄 创建动态连接库-vc++编程指南_唐荣军.htm
字号:
COLOR: #0000cc; TEXT-DECORATION: underline
}
#ft {
CLEAR: both; FONT-SIZE: 12px; COLOR: #666666; LINE-HEIGHT: 20px; FONT-FAMILY: Arial; HEIGHT: 20px; TEXT-ALIGN: center
}
#ft A {
COLOR: #7777cc; TEXT-DECORATION: underline
}
#ft A:link {
COLOR: #7777cc; TEXT-DECORATION: underline
}
#ft A:visited {
COLOR: #7777cc; TEXT-DECORATION: underline
}
#usrbar {
LETTER-SPACING: normal
}
#usrbar A {
LETTER-SPACING: normal
}
#usrbar A:link {
LETTER-SPACING: normal
}
#usrbar A:visited {
LETTER-SPACING: normal
}
#ft {
LETTER-SPACING: normal
}
#ft A {
LETTER-SPACING: normal
}
#ft A:link {
LETTER-SPACING: normal
}
#ft A:visited {
LETTER-SPACING: normal
}
</STYLE>
<DIV id=usrbar><NOBR>
<SCRIPT> var myref = encodeURI("http://hi.baidu.com/tanrongjunjun/blog/item/d7c0925277120b0f0cf3e30e%2Ehtml");</SCRIPT>
<A href="http://www.baidu.com/" target=_blank>百度首页</A> | <A
href="http://hi.baidu.com/" target=_blank>百度空间</A>
<SCRIPT language=JavaScript>
document.write(" | <a href='http://passport.baidu.com/?login&tpl=sp&tpl_reg=sp&u="+myref+"'>登录</a>");
</SCRIPT>
</NOBR></DIV>
<DIV id=main align=left><!--[if IE]>
<SCRIPT>
var objmain = document.getElementById("main");
function updatesize(){ var bodyw = window.document.body.offsetWidth; if(bodyw <= 790) objmain.style.width="772px"; else if(bodyw >= 1016) objmain.style.width="996px"; else objmain.style.width="100%"; }
updatesize(); window.onresize = updatesize;
</SCRIPT>
<![endif]-->
<DIV id=header>
<DIV class=lc>
<DIV class=rc></DIV></DIV>
<DIV class=tit><A class=titlink
title="tanrongjunjun的空间 http://hi.baidu.com/tanrongjunjun"
href="http://hi.baidu.com/tanrongjunjun">唐荣军</A></DIV>
<DIV class=desc>个人,私人</DIV>
<DIV id=tabline></DIV>
<DIV id=tab><A href="http://hi.baidu.com/tanrongjunjun">主页</A><A class=on
href="http://hi.baidu.com/tanrongjunjun/blog">博客</A><A
href="http://hi.baidu.com/tanrongjunjun/album">相册</A><SPAN>|</SPAN><A
href="http://hi.baidu.com/tanrongjunjun/profile">个人档案</A> </DIV></DIV>
<DIV class=stage>
<DIV class=stagepad>
<DIV style="WIDTH: 100%">
<TABLE class=modth cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=modtl width=7> </TD>
<TD class=modtc noWrap>
<DIV class=modhead><SPAN class=modtit>查看文章</SPAN></DIV></TD>
<TD class=modtc noWrap align=right></TD>
<TD class=modtr width=7> </TD></TR></TBODY></TABLE>
<DIV class=modbox id=m_blog>
<DIV class=tit>创建动态连接库-vc++编程指南</DIV>
<DIV class=date>2007-04-30 12:40</DIV>
<TABLE style="TABLE-LAYOUT: fixed">
<TBODY>
<TR>
<TD>
<DIV class=cnt>
<P>9.3创建动态连接库<BR><BR>在一些情况下,必须使用动态连接库:<BR><BR>1.多个应用程序共享代码和数据:比如Office软件的各个组成部分有相似的外观和功能,这就是通过共享动态连接库实现的。<BR><BR>2.在钩子程序过滤系统消息时必须使用动态连接库<BR><BR>3.设备驱动程序必须是动态连接库<BR><BR>4.如果要在对话框编辑器中使用自己定义的控件,也必须使用动态连接库<BR><BR>5.动态连接库以一种自然的方式将一个大的应用程序划分为几个小的模块,有利于小组内部成员的分工与合作。而且,各个模块可以独立升级。如果小组中的一个成员开发了一组实用例程,他就可以把这些例程放在一个动态连接库中,让小组的其他成员使用。<BR><BR>6.为了实现应用程序的国际化,往往需要使用动态连接库。使用动态连接库可以将针对某一国家、语言的信息存放在其中。对于不同的版本,使用不同的动态连接库。在使用AppWizard生成应用程序时,我们可以指定资源文件使用的语言,这就是通过提供不同的动态连接库实现的。<BR><BR>MFC支持两类动态连接库的创建:<BR><BR>用户动态连接库<BR><BR>MFC扩展类库。<BR><BR>9.3.1用户动态连接库(_USRDLL)<BR><BR>用户动态连接库一般使用C语言接口。要创建一个动态连接库,选择File->New菜单,弹出New对话框。在Projects标签页下,选择“Win32
Dynamic-Link Library”。Visual
C++就会创建动态连接库所需的工程文件和MAK文件。<BR><BR>然后把下面两个文件加入到工程中(Project-Add to
Project-Files菜单)。<BR><BR>文件1:mymaths.cpp<BR></P>
<P><BR></P>
<P>////////////////////////////<BR><BR>//mymaths.cpp<BR><BR>//<BR><BR>//a
maths API
DLL.<BR><BR>//<BR><BR>///////////////////////////<BR><BR>#include<windows.h><BR><BR>//Declare
the DLL functions prototypes<BR><BR>int Summary(int);<BR><BR>int
Factorial(int);<BR><BR>//////////////////////////<BR><BR>//DllEntryPoint():The
entry point of the
DLL<BR><BR>//<BR><BR>/////////////////////////<BR><BR>BOOL WINAPI
DLLEntryPoint(HINSTANCE hDLL,DWORD dwReason,<BR><BR>LPVOID
Reserved)<BR><BR>{<BR><BR>switch(dwReason)<BR><BR>{<BR><BR>case
DLL_PROCESS_ATTACH:<BR><BR>{<BR><BR>//一些初始化代码<BR><BR>break;<BR><BR>}<BR><BR>case
DLL_PROCESS_DETACH:<BR><BR>{<BR><BR>//一些用于清理的代码<BR><BR>break;<BR><BR>}<BR><BR>}<BR><BR>return
TRUE;<BR><BR>}<BR><BR>int Summary(int n)<BR><BR>{<BR><BR>int
sum=0;<BR><BR>int
i;<BR><BR>for(i=1;i<=n;i++)<BR><BR>{<BR><BR>sum+=i;<BR><BR>}<BR><BR>return
sum;<BR><BR>}<BR><BR>int Factorial(int n)<BR><BR>{<BR><BR>int
Fact=1;<BR><BR>int
i;<BR><BR>for(i=1;i<=n;i++)<BR><BR>{<BR><BR>Fact=Fact*i;<BR><BR>}<BR><BR>return
Fact;<BR><BR>}</P>
<P><BR></P>
<P><BR>//文件2:mymaths.def<BR><BR>//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR><BR>;Mymaths.DEF<BR><BR>;<BR><BR>;The
DEF file for the Mymaths.DLL DLL.<BR><BR>;<BR><BR>LIBRARY
mymaths<BR><BR>CODE PRELOAD MOVEABLE DISCARDABLE<BR><BR>DATA PRELOAD
SINGLE<BR><BR>EXPORTS<BR><BR>;The names of the DLL
functions<BR><BR>Summary<BR><BR>Factorial<BR><BR></P>
<DIV style="OVERFLOW-X: hidden; WIDTH: 85%"><IMG
src="创建动态连接库-vc++编程指南_唐荣军.files/sigline.gif"><BR>我要上学校,天天不迟到,爱学习爱劳动,长大要为社会主义立功劳........<BR><IMG
title=dvubb alt=图片点击可在新窗口打开查看 src="创建动态连接库-vc++编程指南_唐荣军.files/ffff.gif"
border=0></DIV>
<DIV class=postbottom1>
<DIV class=postuserinfo style="HEIGHT: 28px">
<DIV style="FLOAT: left"><IMG style="MARGIN: 4px" alt=ip地址已设置保密
src="创建动态连接库-vc++编程指南_唐荣军.files/ip.gif"></DIV>2006-1-13 11:27:01</DIV>
<DIV class=postie
style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; TEXT-INDENT: 10px; PADDING-TOP: 0px; HEIGHT: 28px">
<DIV style="FLOAT: right; MARGIN-RIGHT: 5px"><A
href="http://www.dingge.com/forum/dispbbs.asp?boardid=43&id=6755#top"><IMG
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN: 4px; BORDER-RIGHT-WIDTH: 0px"
src="创建动态连接库-vc++编程指南_唐荣军.files/p_up.gif"></A> </DIV>
<DIV></DIV></DIV></DIV><A name=32851></A>
<DIV class=postlary2>
<DIV class=postuserinfo>
<DIV
style="PADDING-RIGHT: 0px; PADDING-LEFT: 5px; PADDING-BOTTOM: 0px; LINE-HEIGHT: 30px; PADDING-TOP: 10px; HEIGHT: 30px">
<DIV
style="FILTER: glow(color= #9898BA ,strength= 2 ); FLOAT: left; WIDTH: 120px"><FONT
face=Verdana color=#da2549><STRONG>鼯鼠</STRONG></FONT></DIV>
<DIV style="FLOAT: left; MARGIN: 3px; WIDTH: 23px; TEXT-INDENT: 0px"><IMG
alt=帅哥哟,离线,有人找我吗? src="创建动态连接库-vc++编程指南_唐荣军.files/ofMale.gif"> </DIV>
<DIV style="FLOAT: left; MARGIN: 5px; WIDTH: 15px; TEXT-INDENT: 0px"><IMG
alt=双子座6-6 src="创建动态连接库-vc++编程指南_唐荣军.files/z3.gif"></DIV></DIV>
<DIV><IMG height=80 src="创建动态连接库-vc++编程指南_唐荣军.files/mi.jpg"
width=64></DIV>
<DIV><IMG style="MARGIN: 5px 0px"
src="创建动态连接库-vc++编程指南_唐荣军.files/level14.gif"></DIV>
<DIV>头衔:论坛打杂</DIV>
<DIV>等级:系主任</DIV>
<DIV>威望:<FONT color=#ff0000><STRONG>15</STRONG></FONT></DIV>
<DIV>积分:<STRONG><FONT color=#469a40>122967</FONT></STRONG></DIV>
<DIV>现金:1000003134</DIV>
<DIV>文章:7630</DIV>
<DIV>门派:无门无派</DIV>
<DIV>注册:2003年4月22日</DIV></DIV>
<DIV class=postie>
<DIV>
<DIV style="FLOAT: right">第 <FONT color=#ff0000>2</FONT> 楼</DIV><A
href="https://www.alipay.com/payto:m9551@QQ.com&partner=2088002048522272"
target=_blank><IMG alt=用支付宝给鼯鼠付款或购买其商品,支付宝交易免手续费、安全、快捷!
src="创建动态连接库-vc++编程指南_唐荣军.files/alipay_s.gif" align=middle border=0></A>
<A href="mailto:m9551@QQ.com"><IMG alt=点击这里发送电子邮件给鼯鼠
src="创建动态连接库-vc++编程指南_唐荣军.files/email.gif" align=middle border=0></A>
</DIV>
<HR>
<DIV style="LINE-HEIGHT: 22px; HEIGHT: 22px">
<DIV style="FLOAT: left"><IMG alt=发贴心情
src="创建动态连接库-vc++编程指南_唐荣军.files/face1.gif"></DIV><STRONG></STRONG></DIV>
<DIV
style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word"><PRE>在文件mymaths.cpp开头,声明了动态连接库所包含的两个函数:Summary和Factorial。接着是DllEntryPoint()函数的定义。DllEntryPoint()顾名思义是动态连接库的入口,应用程序通过该入口访问动态连接库提供的服务。DllEntryPoint()主体是一个switch/case语句:<BR><BR>switch(dwReason)<BR><BR>{<BR><BR>case DLL_PROCESS_ATTACH:<BR><BR>{<BR><BR>//一些初始化代码<BR><BR>break;<BR><BR>}<BR><BR>case DLL_PROCESS_DETACH:<BR><BR>{<BR><BR>//一些用于清理的代码<BR><BR>break;<BR><BR>}<BR><BR>}<BR><BR>其中,在case DLL_PROCESS_ATTACH分支可加入动态连接库执行时的一些初始化代码。在case DLL_PROCESS_DETACH加入动态连接库被卸载时的一些清理代码,比如释放动态连接库运行时申请的内存等。<BR><BR>在DllEntryPoint()函数后,是两个函数Summary和Factorial函数的定义。它们的定义与前面的静态库完全相同。在这里用户可以放入任何函数。<BR><BR>另外,我们还需要一个mymaths.def文件。这个文件记录了可被外部应用程序使用的DLL库函数名字。这些名字信息和对应的函数位置的信息将被编译进动态连接库文件中,然后应用程序根据函数名字和函数位置对照表来找到对应的函数。<BR><BR>按F7编译工程,Visual C++就在mymaths\debug目录下生成一个mymaths.dll动态连接库文件。<BR><BR>现在,我们来使用刚才生成的动态连接库。我们并不重新生成一个程序,而是修改前面测试静态库时的test程序。首先,把mymaths\debug目录下的mymaths.dll拷贝到test\debug目录下。test程序运行时,会在该目录下搜索动态连接库文件。然后修改testdlg.h,在其中加入一个函数LoadDLL()的声明,见清单9.4。LoadDLL用于载入动态连接库。<BR><BR>清单9.4 修改后的对话框头文件<BR><BR><P>class CTestDlg : public CDialog<BR><BR>{<BR><BR>// Construction<BR><BR>public:<BR><BR>CTestDlg(CWnd* pParent = NULL); // standard constructor<BR><BR>protected:<BR><BR>void LoadDLL();<BR><BR>//......<BR><BR>}<BR><BR>然后修改testdlg.cpp,修改后如清单9.5。<BR><BR>清单95. TestDlg.cpp文件<BR><BR>// TestDlg.cpp : implementation file<BR><BR>//<BR><BR>#include "stdafx.h"<BR><BR>#include "Test.h"<BR><BR>#include "TestDlg.h"<BR><BR>//#include "mymath.h" //注释掉mymath.h头文件<BR><BR>#ifdef _DEBUG<BR><BR>#define new DEBUG_NEW<BR><BR>#undef THIS_FILE<BR><BR>static char THIS_FILE[] = __FILE__;<BR><BR>#endif<BR><BR>//The instance of the Mymaths.DLL library<BR><BR>HINSTANCE ghMathsDLL=NULL;<BR><BR>//declare the Summary() function from the Mymaths.DLL libray.<BR><BR>typedef int (*SUMMARY)(int);<BR><BR>SUMMARY Summary;<BR><BR>//declare the Factorial() function from<BR><BR>//the Mymaths.DLL library.<BR><BR>typedef int (*FACTORIAL)(int);<BR><BR>FACTORIAL Factorial;<BR><BR>/////////////////////////////////////////////////////////////////////////////<BR><BR>// CAboutDlg dialog used for App About<BR><BR>class CAboutDlg : public CDialog<BR><BR>{<BR><BR>//...<BR><BR>};<BR><BR>//CAboutDlg的一些成员函数定义<BR><BR>//CTestDlg的一些成员函数定义<BR><BR>void CTestDlg::OnSum() <BR><BR>{<BR><BR>// TODO: Add your control notification handler code here<BR><BR>LoadDLL();<BR><BR>int nSum=Summary(10);<BR><BR>CString sResult;<BR><BR>sResult.Format("Sum(10)=%d",nSum);<BR><BR>AfxMessageBox(sResult);<BR><BR>}<BR><BR>void CTestDlg::OnFactorial() <BR><BR>{<BR><BR>// TODO: Add your control notification handler code here<BR><BR>LoadDLL();<BR><BR>int nFact=Factorial(10);<BR><BR>CString sResult;<BR><BR>sResult.Format("10!=%d",nFact);<BR><BR>AfxMessageBox(sResult);<BR><BR>}<BR><BR>void CTestDlg::LoadDLL()<BR><BR>{<BR><BR>//如果DLL已经载入,则返回<BR><BR>if(ghMathsDLL!=NULL)<BR><BR>{<BR><BR>return; <BR><BR>}<BR><BR>//载入Mymaths.DLL文件.<BR><BR>ghMathsDLL=LoadLibrary("mymaths.DLL");<BR><BR>//如果载入DLL失败,提示用户<BR><BR>if(ghMathsDLL==NULL)<BR><BR>{<BR><BR>AfxMessageBox("Cannot load DLL file!");<BR><BR>}<BR><BR>//获得DLL中Summary函数的地址<BR><BR>Summary=(SUMMARY)GetProcAddress(ghMathsDLL,"Summary");<BR><BR>//获得DLL中Factorial函数的地址<BR><BR>Factorial=(FACTORIAL)GetProcAddress(ghMathsDLL,"Factorial");<BR><BR>}</P><BR><P><BR> <BR><BR>在testdlg.cpp文件开头,加入:<BR><BR>//The instance of the Mymaths.DLL library<BR><BR>HINSTANCE ghMathsDLL=NULL;<BR><BR>//declare the Summary() function from the Mymaths.DLL libray.<BR><BR>typedef int (*SUMMARY)(int);<BR><BR>SUMMARY Summary;<BR><BR>//declare the Factorial() function from<BR><BR>//the Mymaths.DLL library.<BR><BR>typedef int (*FACTORIAL)(int);<BR><BR>FACTORIAL Factorial;<BR><BR>首先加入一个ghMathsDLL的全局变量,它是动态连接库载入后的句柄(同应用程序一样,每个动态连接库载入都会有一个句柄和它相对应)。应用程序通过句柄访问库中的函数。然后加入Summary和Factorial函数指针的类型定义。<BR><BR>在LoadDLL()函数定义中,检查动态连接库句柄是否为空;若为空,则用LoadLibrary载入该动态连接库。然后用GetProcAddress取得Summary和Factorial函数地址。<BR><BR>在OnFactorial和OnSummary函数开头,调用LoadDLL(),载入动态连接库。现在编译运行程序,按Factorial按钮测试一下程序。<BR><BR>应用程序是如何查找DLL文件的<BR><BR>应用程序test按以下顺序查找动态连接库文件: <BR><BR>当前目录下(因此要将动态连接库拷贝至DEBUG目录下,因为可执行文件在该目录下) <BR>Windows目录 <BR>Windows系统目录 <BR>PATH环境变量中设置的目录 <BR>列入映射网络的目录表中的目录 <BR> <BR></P><BR></PRE></DIV>
<DIV style="OVERFLOW-X: hidden; WIDTH: 85%"><IMG
src="创建动态连接库-vc++编程指南_唐荣军.files/sigline.gif"><BR>我要上学校,天天不迟到,爱学习爱劳动,长大要为社会主义立功劳........<BR><IMG
title=dvubb alt=图片点击可在新窗口打开查看 src="创建动态连接库-vc++编程指南_唐荣军.files/ffff.gif"
border=0></DIV></DIV></DIV>
<DIV class=postbottom2>
<DIV class=postuserinfo style="HEIGHT: 28px">
<DIV style="FLOAT: left"><IMG style="MARGIN: 4px" alt=ip地址已设置保密
src="创建动态连接库-vc++编程指南_唐荣军.files/ip.gif"></DIV>2006-1-13 11:27:16</DIV>
<DIV class=postie
style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; TEXT-INDENT: 10px; PADDING-TOP: 0px; HEIGHT: 28px">
<DIV style="FLOAT: right; MARGIN-RIGHT: 5px"><A
href="http://www.dingge.com/forum/dispbbs.asp?boardid=43&id=6755#top"><IMG
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN: 4px; BORDER-RIGHT-WIDTH: 0px"
src="创建动态连接库-vc++编程指南_唐荣军.files/p_up.gif"></A> </DIV>
<DIV></DIV></DIV></DIV><A name=32852></A>
<DIV class=postlary1>
<DIV class=postuserinfo>
<DIV
style="PADDING-RIGHT: 0px; PADDING-LEFT: 5px; PADDING-BOTTOM: 0px; LINE-HEIGHT: 30px; PADDING-TOP: 10px; HEIGHT: 30px">
<DIV
style="FILTER: glow(color= #9898BA ,strength= 2 ); FLOAT: left; WIDTH: 120px"><FONT
face=Verdana color=#da2549><STRONG>鼯鼠</STRONG></FONT></DIV>
<DIV style="FLOAT: left; MARGIN: 3px; WIDTH: 23px; TEXT-INDENT: 0px"><IMG
alt=帅哥哟,离线,有人找我吗? src="创建动态连接库-vc++编程指南_唐荣军.files/ofMale.gif"> </DIV>
<DIV style="FLOAT: left; MARGIN: 5px; WIDTH: 15px; TEXT-INDENT: 0px"><IMG
alt=双子座6-6 src="创建动态连接库-vc++编程指南_唐荣军.files/z3.gif"></DIV></DIV>
<DIV><IMG height=80 src="创建动态连接库-vc++编程指南_唐荣军.files/mi.jpg"
width=64></DIV>
<DIV><IMG style="MARGIN: 5px 0px"
src="创建动态连接库-vc++编程指南_唐荣军.files/level14.gif"></DIV>
<DIV>头衔:论坛打杂</DIV>
<DIV>等级:系主任</DIV>
<DIV>威望:<FONT color=#ff0000><STRONG>15</STRONG></FONT></DIV>
<DIV>积分:<STRONG><FONT color=#469a40>122967</FONT></STRONG></DIV>
<DIV>现金:1000003134</DIV>
<DIV>文章:7630</DIV>
<DIV>门派:无门无派</DIV>
<DIV>注册:2003年4月22日</DIV></DIV>
<DIV class=postie>
<DIV>
<DIV style="FLOAT: right">第 <FONT color=#ff0000>3</FONT> 楼</DIV><A
href="https://www.alipay.com/payto:m9551@QQ.com&partner=2088002048522272"
target=_blank><IMG alt=用支付宝给鼯鼠付款或购买其商品,支付宝交易免手续费、安全、快捷!
src="创建动态连接库-vc++编程指南_唐荣军.files/alipay_s.gif" align=middle border=0></A>
<A href="mailto:m9551@QQ.com"><IMG alt=点击这里发送电子邮件给鼯鼠
src="创建动态连接库-vc++编程指南_唐荣军.files/email.gif" align=middle border=0></A>
</DIV>
<HR>
<DIV style="LINE-HEIGHT: 22px; HEIGHT: 22px">
<DIV style="FLOAT: left"><IMG alt=发贴心情
src="创建动态连接库-vc++编程指南_唐荣军.files/face1.gif"></DIV><STRONG></STRONG></DIV>
<DIV
style="PADDING-RIGHT: 0px; MARGIN-TOP: 10px; FONT-SIZE: 9pt; OVERFLOW-X: hidden; WIDTH: 97%; WORD-BREAK: break-all; TEXT-INDENT: 24px; LINE-HEIGHT: normal; HEIGHT: 200px; WORD-WRAP: break-word"><PRE>调用动态连接库中的函数的方法<BR><BR>有两种方法可以调用动态连接库中的函数:<BR><BR>1.通过引入库:<BR><BR>利用Visual C++提供的IMPLIB工具为动态连接库生成引入库,为引入库设计一个头文件:<BR><BR>#ifndef _MYMATH_H<BR><BR>#define _MYMATH_H<BR><BR>extern “C”<BR><BR>{<BR><BR>int Summary(int n);<BR><BR>int Factorial(int n);<BR><BR>}<BR><BR>#endif<BR><BR>将该头文件包含在使用动态连接库的源文件中,连接应用程序时会连接上该引入库。这样,应用程序就可以象使用静态连接库一样自由的使用动态连接库中的函数了。注意要把动态连接库拷贝到应用程序可执行文件所在的目录(\TEST\DEBUG)下。<BR><BR>这是一种常用的方法。实际上,应用程序就是通过这种方式访问Windows的API函数的。Windows为其内核动态连接库生成引入库并提供了头文件。应用程序在编译时将引入库的信息带入可执行文件中,在运行时通过引入库信息访问API函数。<BR><BR>2. 直接指定库和函数地址<BR><BR>这种方式适合于一些提供文件格式转换等服务的动态连接库。比如,一个程序带有多个动态连接库,分别用于访问JPG、BMP、GIF等多种图像文件格式,这些动态连接库提供了相同的库函数接口。此时,无法使用引入库方式指定库函数。可以采用下面的方法来解决这个问题。<BR><BR><P>HANDLE hLibrary;<BR><BR>FARPROC lpFunc;<BR><BR>int nFormat;<BR><BR>if(nFormat==JPEG)//如果是JPEG格式,装入JPEG动态连接库<BR><BR>{<BR><BR>hLibrary=LoadLibrary(“JPEG.DLL”);<BR><BR>}<BR><BR>else//是GIF格式<BR><BR>hLibrary= LoadLibrary(“GIF.DLL”);<BR><BR>if(hLibrary>=32)<BR><BR>{<BR><BR>lpFunc=GetProcAddress(hLibrary,”ReadImage”);<BR><BR>if(lpFunc!=(FARPROC)NULL)<BR><BR>(*lpFunc)((LPCTSTR)strFileName);<BR><BR>FreeLibrary(hLibrary);<BR><BR>}</P><BR><P><BR>LoadLibrary函数装入所需的动态连接库,并返回库的句柄。如果句柄小于32,则载入库失败,错误含义参见有关手册。GetProcAddress函数使用函数名字取得函数的地址。利用该函数地址,就可以访问动态连接库的函数了。<BR><BR>FreeLibrary通过检查动态连接库的引用计数器,判断是否还有别的程序在使用这个动态连接库。如果没有,就从内存中移去该动态连接库;如果有,将动态连接库的使用计数器减1。LoadLibrary则将引用计数加1。<BR><BR>在用户动态连接库中,也可以使用MFC类。这时,可以选择静态连接和动态连接两种方式使用MFC库。<BR><BR></P></PRE></DIV></DIV></DIV>
<DIV class=postbottom1>
<DIV class=postuserinfo style="HEIGHT: 28px">
<DIV style="FLOAT: left"><IMG style="MARGIN: 4px" alt=ip地址已设置保密
src="创建动态连接库-vc++编程指南_唐荣军.files/ip.gif"></DIV>2006-1-13 11:27:28</DIV>
<DIV class=postie
style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; TEXT-INDENT: 10px; PADDING-TOP: 0px; HEIGHT: 28px">
<DIV style="FLOAT: right; MARGIN-RIGHT: 5px"><A
href="http://www.dingge.com/forum/dispbbs.asp?boardid=43&id=6755#top"><IMG
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN: 4px; BORDER-RIGHT-WIDTH: 0px"
src="创建动态连接库-vc++编程指南_唐荣军.files/p_up.gif"></A> </DIV>
<DIV></DIV></DIV></DIV><A name=32853></A>
<DIV class=postlary2>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -