📄 vc++动态链接库(dll)编程深入浅出(三).htm
字号:
<P><BR> AFX_MODULE_STATE类利用其构造函数和析构函数进行存储模块状态现场及恢复现场的工作,类似汇编中call指令对pc指针和sp寄存器的保存与恢复、中断服务程序的中断现场压栈与恢复以及操作系统线程调度的任务控制块保存与恢复。<BR><BR> 许多看似不着边际的知识点居然有惊人的相似!<BR>AFX_MANAGE_STATE是一个宏,其原型为:
<BR></P>
<P class=code>AFX_MANAGE_STATE( AFX_MODULE_STATE* pModuleState )</P>
<P><BR> 该宏用于将pModuleState设置为当前的有效模块状态。当离开该宏的作用域时(也就离开了pModuleState所指向栈上对象的作用域),先前的模块状态将由AFX_MODULE_STATE的析构函数恢复。<BR><BR> 方法二
在DLL接口函数中使用:<BR></P>
<P
class=code>AfxGetResourceHandle();<BR><BR>AfxSetResourceHandle(HINSTANCE
xxx);</P>
<P><BR> AfxGetResourceHandle用于获取当前资源模块句柄,而AfxSetResourceHandle则用于设置程序目前要使用的资源模块句柄。<BR><BR> 我们将DLL中的接口函数ShowDlg改为:<BR></P>
<P class=code>void ShowDlg(void)<BR><BR>{
<BR><BR>//方法2的状态变更<BR><BR>HINSTANCE save_hInstance =
AfxGetResourceHandle();
<BR><BR>AfxSetResourceHandle(theApp.m_hInstance);
<BR><BR><BR><BR>CDialog
dlg(IDD_DLL_DIALOG);//打开ID为2000的对话框<BR><BR>dlg.DoModal();<BR><BR>//方法2的状态还原<BR><BR>AfxSetResourceHandle(save_hInstance);<BR><BR>}</P>
<P><BR> 通过AfxGetResourceHandle和AfxSetResourceHandle的合理变更,我们能够灵活地设置程序的资源模块句柄,而方法一则只能在DLL接口函数退出的时候才会恢复模块句柄。方法二则不同,如果将ShowDlg改为:<BR></P>
<P class=code>extern CSharedDllApp theApp;
//需要声明theApp外部全局变量<BR><BR>void ShowDlg(void)<BR><BR>{
<BR><BR>//方法2的状态变更<BR><BR>HINSTANCE save_hInstance =
AfxGetResourceHandle();
<BR><BR>AfxSetResourceHandle(theApp.m_hInstance);
<BR><BR><BR>CDialog
dlg(IDD_DLL_DIALOG);//打开ID为2000的对话框<BR><BR>dlg.DoModal();<BR><BR><BR>//方法2的状态还原<BR><BR>AfxSetResourceHandle(save_hInstance);<BR><BR><BR>//使用方法2后在此处再进行操作针对的将是应用程序的资源<BR><BR>CDialog
dlg1(IDD_DLL_DIALOG);
//打开ID为2000的对话框<BR><BR>dlg1.DoModal();<BR><BR>}</P>
<P><BR> 在应用程序主对话框的“调用DLL”按钮上点击,将看到两个对话框,相继为DLL中的对话框(图13)和EXE中的对话框(图14)。<BR><BR
clear=all>方法三
由应用程序自身切换<BR><BR> 资源模块的切换除了可以由DLL接口函数完成以外,由应用程序自身也能完成(下载本工程<A
href="http://www.pconline.com.cn/pcedu/empolder/gj/vc/0509/acc/yyqh_SharedDll.zip"><U><FONT
color=#0000ff>附件</FONT></U></A>)。<BR><BR> 现在我们把DLL中的接口函数改为最简单的:<BR></P>
<P class=code>void ShowDlg(void)<BR><BR>{ <BR><BR><BR>CDialog
dlg(IDD_DLL_DIALOG);
//打开ID为2000的对话框<BR><BR>dlg.DoModal();<BR><BR>}</P>
<P><BR> 而将应用程序的OnCalldllButton函数改为:<BR></P>
<P class=code>void CSharedDllCallDlg::OnCalldllButton()
<BR><BR>{<BR><BR>//方法3:由应用程序本身进行状态切换<BR><BR><BR>//获取EXE模块句柄<BR><BR>HINSTANCE
exe_hInstance = GetModuleHandle(NULL); <BR><BR>//或者HINSTANCE
exe_hInstance = AfxGetResourceHandle();
<BR><BR><BR>//获取DLL模块句柄<BR><BR>HINSTANCE dll_hInstance =
GetModuleHandle("SharedDll.dll");
<BR><BR><BR>AfxSetResourceHandle(dll_hInstance);
//切换状态<BR><BR>ShowDlg(); //此时显示的是DLL的对话框
<BR><BR>AfxSetResourceHandle(exe_hInstance);
//恢复状态<BR><BR><BR>//资源模块恢复后再调用ShowDlg<BR><BR>ShowDlg();
//此时显示的是EXE的对话框<BR><BR><BR>}</P>
<P><BR> 方法三中的Win32函数GetModuleHandle可以根据DLL的文件名获取DLL的模块句柄。如果需要得到EXE模块的句柄,则应调用带有Null参数的GetModuleHandle。<BR><BR> 方法三与方法二的不同在于方法三是在应用程序中利用AfxGetResourceHandle和AfxSetResourceHandle进行资源模块句柄切换的。同样地,在应用程序主对话框的“调用DLL”按钮上点击,也将看到两个对话框,相继为DLL中的对话框(图13)和EXE中的对话框(图14)。<BR><BR> 在下一节我们将对MFC扩展DLL进行详细分析和实例讲解,欢迎您继续关注本系列连载。</P></TD></TR>
<TR class=left_tdbgall align=right>
<TD colSpan=2 height=24>【字体:<A class=top_UserLogin
href="javascript:fontZoomA();">小</A> <A class=top_UserLogin
href="javascript:fontZoomB();">大</A>】【<A
href="http://www.study888.com/computer/Comment.asp?ArticleID=125869"
target=_blank>发表评论</A>】【<A
href="http://www.study888.com/User/User_Favorite.asp?Action=Add&ChannelID=25&InfoID=125869"
target=_blank>加入收藏</A>】【<A
href="http://www.study888.com/computer/SendMail.asp?ArticleID=125869"
target=_blank>告诉好友</A>】【<A
href="http://www.study888.com/computer/Print.asp?ArticleID=125869"
target=_blank>打印此文</A>】【<A
href="javascript:window.close();">关闭窗口</A>】 </TD></TR>
<TR>
<TD class=left_tdbgall align=right colSpan=2
height=24>电脑文章录入:陶闻 责任编辑:陶闻 </TD></TR><!--文章内容下部广告代码开始-->
<TR>
<TD align=middle colSpan=2>
<SCRIPT src="VC++动态链接库(DLL)编程深入浅出(三).files/wen-bot.js"></SCRIPT>
</TD></TR><!--文章同容下部广告代码结束-->
<TR>
<TD class=left_tdbgall align=right colSpan=2 height=24><STRONG><FONT
color=#ff0000>百度搜索:<A
href="http://www.baidu.com/baidu?tn=study888&word=VC++动态链接库(DLL)编程深入浅出(三)"
target=_blank>VC++动态链接库(DLL)编程深入浅出(三)</FONT></A></STRONG></TD></TR>
<TR>
<TD width=5></TD>
<TD width=787>
<LI>上一篇电脑文章: <A class=LinkPrevArticle
title="电脑文章标题:VC++动态链接库(DLL)编程深入浅出(四) 作 者:未知 更新时间:2005-11-21 8:45:37"
href="http://www.study888.com/computer/pro/vc/jiqiao/200511/125868.html">VC++动态链接库(DLL)编程深入浅出(四)</A><BR>
<LI>下一篇电脑文章: <A class=LinkNextArticle
title="电脑文章标题:VC++动态链接库(DLL)编程深入浅出(二) 作 者:未知 更新时间:2005-11-21 8:54:54"
href="http://www.study888.com/computer/pro/vc/jiqiao/200511/125870.html">VC++动态链接库(DLL)编程深入浅出(二)</A></LI></TD></TR><!--文章内容下部广告代码开始-->
<TR>
<TD align=middle colSpan=2>
<SCRIPT src="VC++动态链接库(DLL)编程深入浅出(三).files/wen-bot-2.js"></SCRIPT>
</TD></TR><!--文章同容下部广告代码结束--></TBODY></TABLE><!--网页中部左栏文章内容代码结束-->
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD align=middle height=20></TD></TR></TBODY></TABLE></TD>
<TD style="BORDER-LEFT: #a7a9a7 1px solid" vAlign=top width=180
bgColor=#f8f8f8><!--网页中部右栏代码开始-->
<TABLE style="WORD-BREAK: break-all" cellSpacing=0 cellPadding=0
width="100%" border=0>
<TBODY>
<TR>
<TD class=left_title><IMG height=28
src="VC++动态链接库(DLL)编程深入浅出(三).files/ad_search.gif" width=174></TD></TR>
<TR>
<TD align=middle>
<SCRIPT
src="VC++动态链接库(DLL)编程深入浅出(三).files/ShowSearchForm_wen.js"></SCRIPT>
</TD></TR>
<TR>
<TD align=middle>
<SCRIPT src="VC++动态链接库(DLL)编程深入浅出(三).files/right-1.js"></SCRIPT>
</TD></TR>
<TR>
<TD class=left_title><IMG height=28
src="VC++动态链接库(DLL)编程深入浅出(三).files/ad_ztlm.gif" width=174></TD></TR>
<TR>
<TD class=left_tdbg1>
<SCRIPT language=javascript src=""></SCRIPT>
</TD></TR>
<TR>
<TD class=left_tdbg2></TD></TR>
<TR>
<TD class=left_title><A class=class
href="http://www.study888.com/computer/ShowHot.asp"><IMG height=28
src="VC++动态链接库(DLL)编程深入浅出(三).files/ad_zxrmwz.gif" width=174
border=0></A></TD></TR>
<TR>
<TD class=left_tdbg1
background=VC++动态链接库(DLL)编程深入浅出(三).files/ad_bg2.gif>
<TABLE cellSpacing=0 cellPadding=0 width="100%">
<TBODY>
<TR>
<TD class=listbg vAlign=top width=10><IMG alt=推荐电脑文章
src="VC++动态链接库(DLL)编程深入浅出(三).files/article_elite.gif"></TD>
<TD class=listbg><A class=listA
title="电脑文章标题:微软Visual Studio2005开发工具路线图详解 作 者:未知 更新时间:2005-11-21 9:03:26"
href="http://www.study888.com/computer/pro/vc/jiqiao/200511/125872.html"
target=_self>微软Visual Studio2005…</A></TD></TR>
<TR>
<TD class=listbg2 vAlign=top width=10><IMG alt=普通电脑文章
src="VC++动态链接库(DLL)编程深入浅出(三).files/article_common.gif"></TD>
<TD class=listbg2><A class=listA
title="电脑文章标题:VC++动态链接库(DLL)编程深入浅出(一) 作 者:未知 更新时间:2005-11-21 8:57:05"
href="http://www.study888.com/computer/pro/vc/jiqiao/200511/125871.html"
target=_self>VC++动态链接库(DLL)编…</A></TD></TR>
<TR>
<TD class=listbg vAlign=top width=10><IMG alt=普通电脑文章
src="VC++动态链接库(DLL)编程深入浅出(三).files/article_common.gif"></TD>
<TD class=listbg><A class=listA
title="电脑文章标题:VC++动态链接库(DLL)编程深入浅出(二) 作 者:未知 更新时间:2005-11-21 8:54:54"
href="http://www.study888.com/computer/pro/vc/jiqiao/200511/125870.html"
target=_self>VC++动态链接库(DLL)编…</A></TD></TR>
<TR>
<TD class=listbg2 vAlign=top width=10><IMG alt=普通电脑文章
src="VC++动态链接库(DLL)编程深入浅出(三).files/article_common.gif"></TD>
<TD class=listbg2><A class=listA
title="电脑文章标题:VC++动态链接库(DLL)编程深入浅出(三) 作 者:未知 更新时间:2005-11-21 8:49:45"
href="http://www.study888.com/computer/pro/vc/jiqiao/200511/125869.html"
target=_self>VC++动态链接库(DLL)编…</A></TD></TR>
<TR>
<TD class=listbg vAlign=top width=10><IMG alt=普通电脑文章
src="VC++动态链接库(DLL)编程深入浅出(三).files/article_common.gif"></TD>
<TD class=listbg><A class=listA
title="电脑文章标题:VC++动态链接库(DLL)编程深入浅出(四) 作 者:未知 更新时间:2005-11-21 8:45:37"
href="http://www.study888.com/computer/pro/vc/jiqiao/200511/125868.html"
target=_self>VC++动态链接库(DLL)编…</A></TD></TR>
<TR>
<TD class=listbg2 vAlign=top width=10><IMG alt=普通电脑文章
src="VC++动态链接库(DLL)编程深入浅出(三).files/article_common.gif"></TD>
<TD class=listbg2><A class=listA
title="电脑文章标题:一般性编程问题-C++、MFC(一) 作 者:未知 更新时间:2005-6-9 17:39:43"
href="http://www.study888.com/computer/pro/vc/jiqiao/200506/38776.html"
target=_self>一般性编程问题-C++、M…</A></TD></TR>
<TR>
<TD class=listbg vAlign=top width=10><IMG alt=普通电脑文章
src="VC++动态链接库(DLL)编程深入浅出(三).files/article_common.gif"></TD>
<TD class=listbg><A class=listA
title="电脑文章标题:一般性编程问题-C++、MFC(二) 作 者:未知 更新时间:2005-6-9 17:39:42"
href="http://www.study888.com/computer/pro/vc/jiqiao/200506/38775.html"
target=_self>一般性编程问题-C++、M…</A></TD></TR>
<TR>
<TD class=listbg2 vAlign=top width=10><IMG alt=普通电脑文章
src="VC++动态链接库(DLL)编程深入浅出(三).files/article_common.gif"></TD>
<TD class=listbg2><A class=listA
title="电脑文章标题:一般性编程问题-源码-C++、MFC(三) 作 者:未知 更新时间:2005-6-9 17:39:41"
href="http://www.study888.com/computer/pro/vc/jiqiao/200506/38774.html"
target=_self>一般性编程问题-源码-C…</A></TD></TR>
<TR>
<TD class=listbg vAlign=top width=10><IMG alt=普通电脑文章
src="VC++动态链接库(DLL)编程深入浅出(三).files/article_common.gif"></TD>
<TD class=listbg><A class=listA
title="电脑文章标题:一般性编程问题-源码-C++、MFC(四) 作 者:未知 更新时间:2005-6-9 17:39:40"
href="http://www.study888.com/computer/pro/vc/jiqiao/200506/38773.html"
target=_self>一般性编程问题-源码-C…</A></TD></TR>
<TR>
<TD class=listbg2 vAlign=top width=10><IMG alt=普通电脑文章
src="VC++动态链接库(DLL)编程深入浅出(三).files/article_common.gif"></TD>
<TD class=listbg2><A class=listA
title="电脑文章标题:一般性编程问题-源码-C++、MFC(五) 作 者:未知 更新时间:2005-6-9 17:39:38"
href="http://www.study888.com/computer/pro/vc/jiqiao/200506/38772.html"
target=_self>一般性编程问题-源码-C…</A></TD></TR>
<TR></TR></TBODY></TABLE></TD></TR>
<TR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -