?? vc++動(dòng)態(tài)鏈接庫(kù)(dll)編程深入淺出(三).htm
字號(hào):
<P><BR> AFX_MODULE_STATE類(lèi)利用其構(gòu)造函數(shù)和析構(gòu)函數(shù)進(jìn)行存儲(chǔ)模塊狀態(tài)現(xiàn)場(chǎng)及恢復(fù)現(xiàn)場(chǎng)的工作,類(lèi)似匯編中call指令對(duì)pc指針和sp寄存器的保存與恢復(fù)、中斷服務(wù)程序的中斷現(xiàn)場(chǎng)壓棧與恢復(fù)以及操作系統(tǒng)線程調(diào)度的任務(wù)控制塊保存與恢復(fù)。<BR><BR> 許多看似不著邊際的知識(shí)點(diǎn)居然有驚人的相似!<BR>AFX_MANAGE_STATE是一個(gè)宏,其原型為:
<BR></P>
<P class=code>AFX_MANAGE_STATE( AFX_MODULE_STATE* pModuleState )</P>
<P><BR> 該宏用于將pModuleState設(shè)置為當(dāng)前的有效模塊狀態(tài)。當(dāng)離開(kāi)該宏的作用域時(shí)(也就離開(kāi)了pModuleState所指向棧上對(duì)象的作用域),先前的模塊狀態(tài)將由AFX_MODULE_STATE的析構(gòu)函數(shù)恢復(fù)。<BR><BR> 方法二
在DLL接口函數(shù)中使用:<BR></P>
<P
class=code>AfxGetResourceHandle();<BR><BR>AfxSetResourceHandle(HINSTANCE
xxx);</P>
<P><BR> AfxGetResourceHandle用于獲取當(dāng)前資源模塊句柄,而AfxSetResourceHandle則用于設(shè)置程序目前要使用的資源模塊句柄。<BR><BR> 我們將DLL中的接口函數(shù)ShowDlg改為:<BR></P>
<P class=code>void ShowDlg(void)<BR><BR>{
<BR><BR>//方法2的狀態(tài)變更<BR><BR>HINSTANCE save_hInstance =
AfxGetResourceHandle();
<BR><BR>AfxSetResourceHandle(theApp.m_hInstance);
<BR><BR><BR><BR>CDialog
dlg(IDD_DLL_DIALOG);//打開(kāi)ID為2000的對(duì)話框<BR><BR>dlg.DoModal();<BR><BR>//方法2的狀態(tài)還原<BR><BR>AfxSetResourceHandle(save_hInstance);<BR><BR>}</P>
<P><BR> 通過(guò)AfxGetResourceHandle和AfxSetResourceHandle的合理變更,我們能夠靈活地設(shè)置程序的資源模塊句柄,而方法一則只能在DLL接口函數(shù)退出的時(shí)候才會(huì)恢復(fù)模塊句柄。方法二則不同,如果將ShowDlg改為:<BR></P>
<P class=code>extern CSharedDllApp theApp;
//需要聲明theApp外部全局變量<BR><BR>void ShowDlg(void)<BR><BR>{
<BR><BR>//方法2的狀態(tài)變更<BR><BR>HINSTANCE save_hInstance =
AfxGetResourceHandle();
<BR><BR>AfxSetResourceHandle(theApp.m_hInstance);
<BR><BR><BR>CDialog
dlg(IDD_DLL_DIALOG);//打開(kāi)ID為2000的對(duì)話框<BR><BR>dlg.DoModal();<BR><BR><BR>//方法2的狀態(tài)還原<BR><BR>AfxSetResourceHandle(save_hInstance);<BR><BR><BR>//使用方法2后在此處再進(jìn)行操作針對(duì)的將是應(yīng)用程序的資源<BR><BR>CDialog
dlg1(IDD_DLL_DIALOG);
//打開(kāi)ID為2000的對(duì)話框<BR><BR>dlg1.DoModal();<BR><BR>}</P>
<P><BR> 在應(yīng)用程序主對(duì)話框的“調(diào)用DLL”按鈕上點(diǎn)擊,將看到兩個(gè)對(duì)話框,相繼為DLL中的對(duì)話框(圖13)和EXE中的對(duì)話框(圖14)。<BR><BR
clear=all>方法三
由應(yīng)用程序自身切換<BR><BR> 資源模塊的切換除了可以由DLL接口函數(shù)完成以外,由應(yīng)用程序自身也能完成(下載本工程<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> 現(xiàn)在我們把DLL中的接口函數(shù)改為最簡(jiǎn)單的:<BR></P>
<P class=code>void ShowDlg(void)<BR><BR>{ <BR><BR><BR>CDialog
dlg(IDD_DLL_DIALOG);
//打開(kāi)ID為2000的對(duì)話框<BR><BR>dlg.DoModal();<BR><BR>}</P>
<P><BR> 而將應(yīng)用程序的OnCalldllButton函數(shù)改為:<BR></P>
<P class=code>void CSharedDllCallDlg::OnCalldllButton()
<BR><BR>{<BR><BR>//方法3:由應(yīng)用程序本身進(jìn)行狀態(tài)切換<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);
//切換狀態(tài)<BR><BR>ShowDlg(); //此時(shí)顯示的是DLL的對(duì)話框
<BR><BR>AfxSetResourceHandle(exe_hInstance);
//恢復(fù)狀態(tài)<BR><BR><BR>//資源模塊恢復(fù)后再調(diào)用ShowDlg<BR><BR>ShowDlg();
//此時(shí)顯示的是EXE的對(duì)話框<BR><BR><BR>}</P>
<P><BR> 方法三中的Win32函數(shù)GetModuleHandle可以根據(jù)DLL的文件名獲取DLL的模塊句柄。如果需要得到EXE模塊的句柄,則應(yīng)調(diào)用帶有Null參數(shù)的GetModuleHandle。<BR><BR> 方法三與方法二的不同在于方法三是在應(yīng)用程序中利用AfxGetResourceHandle和AfxSetResourceHandle進(jìn)行資源模塊句柄切換的。同樣地,在應(yīng)用程序主對(duì)話框的“調(diào)用DLL”按鈕上點(diǎn)擊,也將看到兩個(gè)對(duì)話框,相繼為DLL中的對(duì)話框(圖13)和EXE中的對(duì)話框(圖14)。<BR><BR> 在下一節(jié)我們將對(duì)MFC擴(kuò)展DLL進(jìn)行詳細(xì)分析和實(shí)例講解,歡迎您繼續(xù)關(guān)注本系列連載。</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>發(fā)表評(píng)論</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();">關(guān)閉窗口</A>】 </TD></TR>
<TR>
<TD class=left_tdbgall align=right colSpan=2
height=24>電腦文章錄入:陶聞 責(zé)任編輯:陶聞 </TD></TR><!--文章內(nèi)容下部廣告代碼開(kāi)始-->
<TR>
<TD align=middle colSpan=2>
<SCRIPT src="VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三).files/wen-bot.js"></SCRIPT>
</TD></TR><!--文章同容下部廣告代碼結(jié)束-->
<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++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三)"
target=_blank>VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三)</FONT></A></STRONG></TD></TR>
<TR>
<TD width=5></TD>
<TD width=787>
<LI>上一篇電腦文章: <A class=LinkPrevArticle
title="電腦文章標(biāo)題:VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(四) 作 者:未知 更新時(shí)間:2005-11-21 8:45:37"
href="http://www.study888.com/computer/pro/vc/jiqiao/200511/125868.html">VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(四)</A><BR>
<LI>下一篇電腦文章: <A class=LinkNextArticle
title="電腦文章標(biāo)題:VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(二) 作 者:未知 更新時(shí)間:2005-11-21 8:54:54"
href="http://www.study888.com/computer/pro/vc/jiqiao/200511/125870.html">VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(二)</A></LI></TD></TR><!--文章內(nèi)容下部廣告代碼開(kāi)始-->
<TR>
<TD align=middle colSpan=2>
<SCRIPT src="VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三).files/wen-bot-2.js"></SCRIPT>
</TD></TR><!--文章同容下部廣告代碼結(jié)束--></TBODY></TABLE><!--網(wǎng)頁(yè)中部左欄文章內(nèi)容代碼結(jié)束-->
<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><!--網(wǎng)頁(yè)中部右欄代碼開(kāi)始-->
<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++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三).files/ad_search.gif" width=174></TD></TR>
<TR>
<TD align=middle>
<SCRIPT
src="VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三).files/ShowSearchForm_wen.js"></SCRIPT>
</TD></TR>
<TR>
<TD align=middle>
<SCRIPT src="VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三).files/right-1.js"></SCRIPT>
</TD></TR>
<TR>
<TD class=left_title><IMG height=28
src="VC++動(dòng)態(tài)鏈接庫(kù)(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++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三).files/ad_zxrmwz.gif" width=174
border=0></A></TD></TR>
<TR>
<TD class=left_tdbg1
background=VC++動(dòng)態(tài)鏈接庫(kù)(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++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三).files/article_elite.gif"></TD>
<TD class=listbg><A class=listA
title="電腦文章標(biāo)題:微軟Visual Studio2005開(kāi)發(fā)工具路線圖詳解 作 者:未知 更新時(shí)間: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++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三).files/article_common.gif"></TD>
<TD class=listbg2><A class=listA
title="電腦文章標(biāo)題:VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(一) 作 者:未知 更新時(shí)間:2005-11-21 8:57:05"
href="http://www.study888.com/computer/pro/vc/jiqiao/200511/125871.html"
target=_self>VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編…</A></TD></TR>
<TR>
<TD class=listbg vAlign=top width=10><IMG alt=普通電腦文章
src="VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三).files/article_common.gif"></TD>
<TD class=listbg><A class=listA
title="電腦文章標(biāo)題:VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(二) 作 者:未知 更新時(shí)間:2005-11-21 8:54:54"
href="http://www.study888.com/computer/pro/vc/jiqiao/200511/125870.html"
target=_self>VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編…</A></TD></TR>
<TR>
<TD class=listbg2 vAlign=top width=10><IMG alt=普通電腦文章
src="VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三).files/article_common.gif"></TD>
<TD class=listbg2><A class=listA
title="電腦文章標(biāo)題:VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三) 作 者:未知 更新時(shí)間:2005-11-21 8:49:45"
href="http://www.study888.com/computer/pro/vc/jiqiao/200511/125869.html"
target=_self>VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編…</A></TD></TR>
<TR>
<TD class=listbg vAlign=top width=10><IMG alt=普通電腦文章
src="VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三).files/article_common.gif"></TD>
<TD class=listbg><A class=listA
title="電腦文章標(biāo)題:VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(四) 作 者:未知 更新時(shí)間:2005-11-21 8:45:37"
href="http://www.study888.com/computer/pro/vc/jiqiao/200511/125868.html"
target=_self>VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編…</A></TD></TR>
<TR>
<TD class=listbg2 vAlign=top width=10><IMG alt=普通電腦文章
src="VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三).files/article_common.gif"></TD>
<TD class=listbg2><A class=listA
title="電腦文章標(biāo)題:一般性編程問(wèn)題-C++、MFC(一) 作 者:未知 更新時(shí)間:2005-6-9 17:39:43"
href="http://www.study888.com/computer/pro/vc/jiqiao/200506/38776.html"
target=_self>一般性編程問(wèn)題-C++、M…</A></TD></TR>
<TR>
<TD class=listbg vAlign=top width=10><IMG alt=普通電腦文章
src="VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三).files/article_common.gif"></TD>
<TD class=listbg><A class=listA
title="電腦文章標(biāo)題:一般性編程問(wèn)題-C++、MFC(二) 作 者:未知 更新時(shí)間:2005-6-9 17:39:42"
href="http://www.study888.com/computer/pro/vc/jiqiao/200506/38775.html"
target=_self>一般性編程問(wèn)題-C++、M…</A></TD></TR>
<TR>
<TD class=listbg2 vAlign=top width=10><IMG alt=普通電腦文章
src="VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三).files/article_common.gif"></TD>
<TD class=listbg2><A class=listA
title="電腦文章標(biāo)題:一般性編程問(wèn)題-源碼-C++、MFC(三) 作 者:未知 更新時(shí)間:2005-6-9 17:39:41"
href="http://www.study888.com/computer/pro/vc/jiqiao/200506/38774.html"
target=_self>一般性編程問(wèn)題-源碼-C…</A></TD></TR>
<TR>
<TD class=listbg vAlign=top width=10><IMG alt=普通電腦文章
src="VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三).files/article_common.gif"></TD>
<TD class=listbg><A class=listA
title="電腦文章標(biāo)題:一般性編程問(wèn)題-源碼-C++、MFC(四) 作 者:未知 更新時(shí)間:2005-6-9 17:39:40"
href="http://www.study888.com/computer/pro/vc/jiqiao/200506/38773.html"
target=_self>一般性編程問(wèn)題-源碼-C…</A></TD></TR>
<TR>
<TD class=listbg2 vAlign=top width=10><IMG alt=普通電腦文章
src="VC++動(dòng)態(tài)鏈接庫(kù)(DLL)編程深入淺出(三).files/article_common.gif"></TD>
<TD class=listbg2><A class=listA
title="電腦文章標(biāo)題:一般性編程問(wèn)題-源碼-C++、MFC(五) 作 者:未知 更新時(shí)間:2005-6-9 17:39:38"
href="http://www.study888.com/computer/pro/vc/jiqiao/200506/38772.html"
target=_self>一般性編程問(wèn)題-源碼-C…</A></TD></TR>
<TR></TR></TBODY></TABLE></TD></TR>
<TR>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -