亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? mfc教程_ mfc的dll.htm

?? MFC (Microsoft Foundation Class Library)中的各種類結(jié)合起來構(gòu)成了一個應(yīng)用程序框架
?? HTM
?? 第 1 頁 / 共 2 頁
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0041)http://www.vczx.com/tutorial/mfc/mfc7.php -->
<HTML><HEAD><TITLE>MFC教程_ MFC的DLL</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.3354" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff>
<OL start=7>
  <P align=justify>
  <LI><A name=_Toc445889069></A><A name=_Toc445782472></A><A 
  name=_Toc452640933></A><A name=_Toc457299032></A><B>MFC的DLL</B> 
  <P></P>
  <P 
  align=justify>一般的,在介紹Windows編程的書中講述DLL的有關(guān)知識較多,而介紹MFC的書則比較少地提到。即使使用MFC來編寫動態(tài)鏈接庫,對于初步接觸DLL的程序員來說,了解DLL的背景知識是必要的。另外,MFC提供了新的手段來幫助編寫DLL程序。所以,本節(jié)先簡潔的介紹有關(guān)概念。</P>
  <OL>
    <P align=justify>
    <LI><A name=_Toc445889070></A><A name=_Toc445782473></A><A 
    name=_Toc452640934></A><A name=_Toc457299033></A><B>DLL的背景知識</B> 
    <P></P></LI></OL></LI></OL>
<OL>
  <P align=justify>
  <LI>靜態(tài)鏈接和動態(tài)鏈接 
  <P></P></LI></OL>
<P align=justify>當(dāng)前鏈接的目標(biāo)代碼(.obj)如果引用了一個函數(shù)卻沒有定義它,鏈接程序可能通過兩種途徑來解決這種從外部對該函數(shù)的引用:</P>
<UL>
  <P align=justify>
  <LI>靜態(tài)鏈接 
  <P></P></LI></UL>
<P 
align=justify>鏈接程序搜索一個或者多個庫文件(標(biāo)準(zhǔn)庫.lib),直到在某個庫中找到了含有所引用函數(shù)的對象模塊,然后鏈接程序把這個對象模塊拷貝到結(jié)果可執(zhí)行文件(.exe)中。鏈接程序維護(hù)對該函數(shù)的所有引用,使它們指向該程序中現(xiàn)在含有該函數(shù)拷貝的地方。</P>
<UL>
  <P align=justify>
  <LI>動態(tài)鏈接 
  <P></P></LI></UL>
<P 
align=justify>鏈接程序也是搜索一個或者多個庫文件(輸入庫.lib),當(dāng)在某個庫中找到了所引用函數(shù)的輸入記錄時,便把輸入記錄拷貝到結(jié)果可執(zhí)行文件中,產(chǎn)生一次對該函數(shù)的動態(tài)鏈接。這里,輸入記錄不包含函數(shù)的代碼或者數(shù)據(jù),而是指定一個包含該函數(shù)代碼以及該函數(shù)的順序號或函數(shù)名的動態(tài)鏈接庫。</P>
<P 
align=justify>當(dāng)程序運行時,Windows裝入程序,并尋找文件中出現(xiàn)的任意動態(tài)鏈接。對于每個動態(tài)鏈接,Windows裝入指定的DLL并且把它映射到調(diào)用進(jìn)程的虛擬地址空間(如果沒有映射的話)。因此,調(diào)用和目標(biāo)函數(shù)之間的實際鏈接不是在鏈接應(yīng)用程序時一次完成的(靜態(tài)),相反,是運行該程序時由Windows完成的(動態(tài))。</P>
<P align=justify>這種動態(tài)鏈接稱為加載時動態(tài)鏈接。還有一種動態(tài)鏈接方式下面會談到。</P>
<OL>
  <P align=justify>
  <LI>動態(tài)鏈接的方法 
  <P></P></LI></OL>
<P align=justify>鏈接動態(tài)鏈接庫里的函數(shù)的方法如下:</P>
<UL>
  <P align=justify>
  <LI>加載時動態(tài)鏈接(Load_time dynamic linking) 
  <P></P></LI></UL>
<P align=justify>如上所述。Windows搜索要裝入的DLL時,按以下順序:</P>
<P align=justify>應(yīng)用程序所在目錄→當(dāng)前目錄→Windows SYSTEM目錄→Windows目錄→PATH環(huán)境變量指定的路徑。</P>
<UL>
  <P align=justify>
  <LI>運行時動態(tài)鏈接(Run_time dynamic linking) 
  <P></P></LI></UL>
<P 
align=justify>程序員使用LoadLibrary把DLL裝入內(nèi)存并且映射DLL到調(diào)用進(jìn)程的虛擬地址空間(如果已經(jīng)作了映射,則增加DLL的引用計數(shù))。首先,LoadLibrary搜索DLL,搜索順序如同加載時動態(tài)鏈接一樣。然后,使用GetProcessAddress得到DLL中輸出函數(shù)的地址,并調(diào)用它。最后,使用FreeLibrary減少DLL的引用計數(shù),當(dāng)引用計數(shù)為0時,把DLL模塊從當(dāng)前進(jìn)程的虛擬空間移走。</P>
<OL>
  <P align=justify>
  <LI>輸入庫(.lib): 
  <P></P>
  <P align=justify>輸入庫以.lib為擴展名,格式是COFF(Common object file 
  format)。COFF標(biāo)準(zhǔn)庫(靜態(tài)鏈接庫)的擴展名也是.lib。COFF格式的文件可以用dumpbin來查看。</P>
  <P 
  align=justify>輸入庫包含了DLL中的輸出函數(shù)或者輸出數(shù)據(jù)的動態(tài)鏈接信息。當(dāng)使用MFC創(chuàng)建DLL程序時,會生成輸入庫(.lib)和動態(tài)鏈接庫(.dll)。</P>
  <P align=justify></P>
  <LI>輸出文件(.exp) 
  <P></P>
  <P align=justify>輸出文件以.exp為擴展名,包含了輸出的函數(shù)和數(shù)據(jù)的信息,鏈接程序使用它來創(chuàng)建DLL動態(tài)鏈接庫。</P>
  <P align=justify></P>
  <LI>映像文件(.map) 
  <P></P>
  <P align=justify>映像文件以.map為擴展名,包含了如下信息:</P>
  <P 
  align=justify>模塊名、時間戳、組列表(每一組包含了形式如section::offset的起始地址,長度、組名、類名)、公共符號列表(形式如section::offset的地址,符號名,虛擬地址flat 
  address,定義符號的.obj文件)、入口點如section::offset、fixup列表。</P>
  <P align=justify></P>
  <LI>lib.exe工具 
  <P></P>
  <P 
  align=justify>它可以用來創(chuàng)建輸入庫和輸出文件。通常,不用使用lib.exe,如果工程目標(biāo)是創(chuàng)建DLL程序,鏈接程序會完成輸入庫的創(chuàng)建。</P>
  <P align=justify>更詳細(xì)的信息可以參見MFC使用手冊和文檔。</P>
  <P align=justify></P>
  <LI>鏈接規(guī)范(Linkage Specification ) 
  <P></P>
  <P 
  align=justify>這是指鏈接采用不同編程語言寫的函數(shù)(Function)或者過程(Procedure)的鏈接協(xié)議。MFC所支持的鏈接規(guī)范是“C”和“C++”,缺省的是“C++”規(guī)范,如果要聲明一個“C”鏈接的函數(shù)或者變量,則一般采用如下語法:</P>
  <P align=justify>#if defined(__cplusplus)</P>
  <P align=justify>extern "C"</P>
  <P align=justify>{</P>
  <P align=justify>#endif</P>
  <P align=justify></P>
  <P align=justify>//函數(shù)聲明(function declarations)</P>
  <P align=justify>…</P>
  <P align=justify>//變量聲明(variables declarations)</P>
  <P align=justify>#if defined(__cplusplus)</P>
  <P align=justify>}</P>
  <P align=justify>#endif</P>
  <P align=justify>所有的C標(biāo)準(zhǔn)頭文件都是用如上語法聲明的,這樣它們在C++環(huán)境下可以使用。</P>
  <P align=justify></P>
  <LI>修飾名(Decoration name) 
  <P></P></LI></OL>
<P 
align=justify>“C”或者“C++”函數(shù)在內(nèi)部(編譯和鏈接)通過修飾名識別。修飾名是編譯器在編譯函數(shù)定義或者原型時生成的字符串。有些情況下使用函數(shù)的修飾名是必要的,如在模塊定義文件里頭指定輸出“C++”重載函數(shù)、構(gòu)造函數(shù)、析構(gòu)函數(shù),又如在匯編代碼里調(diào)用“C””或“C++”函數(shù)等。</P>
<P align=justify>修飾名由函數(shù)名、類名、調(diào)用約定、返回類型、參數(shù)等共同決定。</P>
<OL>
  <OL>
    <P align=justify>
    <LI><A name=_Toc445889071></A><A name=_Toc445782474></A><A 
    name=_Toc452640935></A><A name=_Toc457299034></A><B>調(diào)用約定</B> 
    <P></P></LI></OL></OL>
<P align=justify>調(diào)用約定(Calling 
convention)決定以下內(nèi)容:函數(shù)參數(shù)的壓棧順序,由調(diào)用者還是被調(diào)用者把參數(shù)彈出棧,以及產(chǎn)生函數(shù)修飾名的方法。MFC支持以下調(diào)用約定:</P>
<OL>
  <P align=justify>
  <LI>_cdecl 
  <P></P>
  <P 
  align=justify>按從右至左的順序壓參數(shù)入棧,由調(diào)用者把參數(shù)彈出棧。對于“C”函數(shù)或者變量,修飾名是在函數(shù)名前加下劃線。對于“C++”函數(shù),有所不同。</P>
  <P align=justify>如函數(shù)void 
  test(void)的修飾名是_test;對于不屬于一個類的“C++”全局函數(shù),修飾名是?test@@ZAXXZ。</P>
  <P align=justify>這是MFC缺省調(diào)用約定。由于是調(diào)用者負(fù)責(zé)把參數(shù)彈出棧,所以可以給函數(shù)定義個數(shù)不定的參數(shù),如printf函數(shù)。</P>
  <P align=justify></P>
  <LI>_stdcall 
  <P></P>
  <P 
  align=justify>按從右至左的順序壓參數(shù)入棧,由被調(diào)用者把參數(shù)彈出棧。對于“C”函數(shù)或者變量,修飾名以下劃線為前綴,然后是函數(shù)名,然后是符號“@”及參數(shù)的字節(jié)數(shù),如函數(shù)int 
  func(int a, double b)的修飾名是_func@12。對于“C++”函數(shù),則有所不同。</P>
  <P align=justify>所有的Win32 API函數(shù)都遵循該約定。</P>
  <P align=justify></P>
  <LI>_fastcall 
  <P></P>
  <P 
  align=justify>頭兩個DWORD類型或者占更少字節(jié)的參數(shù)被放入ECX和EDX寄存器,其他剩下的參數(shù)按從右到左的順序壓入棧。由被調(diào)用者把參數(shù)彈出棧,對于“C”函數(shù)或者變量,修飾名以“@”為前綴,然后是函數(shù)名,接著是符號“@”及參數(shù)的字節(jié)數(shù),如函數(shù)int 
  func(int a, double b)的修飾名是@func@12。對于“C++”函數(shù),有所不同。</P>
  <P align=justify>未來的編譯器可能使用不同的寄存器來存放參數(shù)。</P>
  <P align=justify></P>
  <LI>thiscall 
  <P></P>
  <P 
  align=justify>僅僅應(yīng)用于“C++”成員函數(shù)。this指針存放于CX寄存器,參數(shù)從右到左壓棧。thiscall不是關(guān)鍵詞,因此不能被程序員指定。</P>
  <P align=justify></P>
  <LI>naked call 
  <P></P>
  <P 
  align=justify>采用1-4的調(diào)用約定時,如果必要的話,進(jìn)入函數(shù)時編譯器會產(chǎn)生代碼來保存ESI,EDI,EBX,EBP寄存器,退出函數(shù)時則產(chǎn)生代碼恢復(fù)這些寄存器的內(nèi)容。naked 
  call不產(chǎn)生這樣的代碼。</P>
  <P align=justify>naked call不是類型修飾符,故必須和_declspec共同使用,如下:</P>
  <P align=justify>__declspec( naked ) int func( formal_parameters )</P>
  <P align=justify>{</P>
  <P align=justify>// Function body</P>
  <P align=justify>}</P>
  <P align=justify></P>
  <LI>過時的調(diào)用約定 
  <P></P></LI></OL>
<P align=justify>原來的一些調(diào)用約定可以不再使用。它們被定義成調(diào)用約定_stdcall或者_(dá)cdecl。例如:</P>
<P align=justify>#define CALLBACK __stdcall</P>
<P align=justify>#define WINAPI __stdcall</P>
<P align=justify>#define WINAPIV __cdecl</P>
<P align=justify>#define APIENTRY WINAPI</P>
<P align=justify>#define APIPRIVATE __stdcall</P>
<P align=justify>#define PASCAL __stdcall</P>
<P align=justify></P>
<P 
align=justify>表7-1顯示了一個函數(shù)在幾種調(diào)用約定下的修飾名(表中的“C++”函數(shù)指的是“C++”全局函數(shù),不是成員函數(shù)),函數(shù)原型是void 
CALLTYPE test(void),CALLTYPE可以是_cdecl、_fastcall、_stdcall。</P>
<P align=center>表7-1 不同調(diào)用約定下的修飾名</P>
<P align=center>
<CENTER>
<TABLE cellSpacing=1 cellPadding=7 width=487 border=1>
  <TBODY>
  <TR>
    <TD vAlign=top width="24%">
      <P align=justify>調(diào)用約定 </P></TD>
    <TD vAlign=top width="33%">
      <P align=justify>extern “C”或.C文件 </P></TD>
    <TD vAlign=top width="43%">
      <P align=justify>.cpp, .cxx或/TP編譯開關(guān) </P></TD></TR>
  <TR>
    <TD vAlign=top width="24%">
      <P align=justify>_cdecl </P></TD>
    <TD vAlign=top width="33%">
      <P align=justify>_test </P></TD>
    <TD vAlign=top width="43%">
      <P align=justify>?test@@ZAXXZ </P></TD></TR>
  <TR>
    <TD vAlign=top width="24%">
      <P align=justify>_fastcall </P></TD>
    <TD vAlign=top width="33%">
      <P align=justify>@test@0 </P></TD>
    <TD vAlign=top width="43%">
      <P align=justify>?test@@YIXXZ </P></TD></TR>
  <TR>
    <TD vAlign=top width="24%">
      <P align=justify>_stdcall </P></TD>
    <TD vAlign=top width="33%">
      <P align=justify>_test@0 </P></TD>
    <TD vAlign=top width="43%">
      <P align=justify>?test@@YGXXZ </P></TD></TR></TBODY></TABLE></CENTER>
<P></P>
<OL>
  <OL>
    <OL>
      <P align=justify>
      <LI><A name=_Toc445889073></A><A name=_Toc445782476></A><A 
      name=_Toc452640937></A><A name=_Toc457299035></A><B>MFC的DLL應(yīng)用程序的類型</B> 
      <P></P></LI></OL></OL></OL>
<OL>
  <P align=justify>
  <LI>靜態(tài)鏈接到MFC的規(guī)則DLL應(yīng)用程序 
  <P></P>
  <P align=justify>該類DLL應(yīng)用程序里頭的輸出函數(shù)可以被任意Win32程序使用,包括使用MFC的應(yīng)用程序。輸入函數(shù)有如下形式:</P>
  <P align=justify>extern "C" EXPORT YourExportedFunction( );</P>
  <P align=justify>如果沒有extern “C”修飾,輸出函數(shù)僅僅能從C++代碼中調(diào)用。</P>
  <P align=justify>DLL應(yīng)用程序從CWinApp派生,但沒有消息循環(huán)。</P>
  <P align=justify></P>
  <LI>動態(tài)鏈接到MFC的規(guī)則DLL應(yīng)用程序 
  <P></P>
  <P 
  align=justify>該類DLL應(yīng)用程序里頭的輸出函數(shù)可以被任意Win32程序使用,包括使用MFC的應(yīng)用程序。但是,所有從DLL輸出的函數(shù)應(yīng)該以如下語句開始:</P>
  <P align=justify>AFX_MANAGE_STATE(AfxGetStaticModuleState( ))</P>
  <P align=justify>此語句用來正確地切換MFC模塊狀態(tài)。關(guān)于MFC的模塊狀態(tài),后面第9章有詳細(xì)的討論。</P>
  <P align=justify>其他方面同靜態(tài)鏈接到MFC的規(guī)則DLL應(yīng)用程序。</P>
  <P align=justify></P>
  <LI>擴展DLL應(yīng)用程序 
  <P></P></LI></OL>

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天堂蜜桃91精品| 久久综合久久综合亚洲| 国产日韩成人精品| 香蕉乱码成人久久天堂爱免费| 丁香激情综合国产| 欧美一卡在线观看| 一区二区成人在线视频| 成人免费高清视频| 精品国产乱码久久久久久1区2区| 亚洲国产视频a| 99久久婷婷国产综合精品电影| 久久免费午夜影院| 日韩av二区在线播放| 91在线播放网址| 欧美国产乱子伦| 国产麻豆9l精品三级站| 538在线一区二区精品国产| 亚洲一区在线看| www.欧美日韩国产在线| 久久久精品免费观看| 日日噜噜夜夜狠狠视频欧美人| 91成人在线观看喷潮| 亚洲欧洲日本在线| 国产黑丝在线一区二区三区| 精品久久久久久亚洲综合网| 日韩经典一区二区| 欧美日韩久久久| 亚洲午夜电影网| 在线观看视频一区二区欧美日韩| 中文字幕中文字幕中文字幕亚洲无线| 激情av综合网| 久久女同精品一区二区| 国产一区二区三区香蕉| 久久免费偷拍视频| 精品一区二区久久久| 欧美一级高清大全免费观看| 日韩av成人高清| 亚洲无人区一区| 在线观看不卡一区| 一区二区久久久久久| 在线观看91视频| 五月婷婷久久综合| 欧美福利一区二区| 青娱乐精品在线视频| 91精品国产91久久久久久最新毛片 | 另类欧美日韩国产在线| 日韩一区二区高清| 蜜臀91精品一区二区三区| 日韩欧美一级特黄在线播放| 免费在线观看视频一区| 91精品国产91久久综合桃花| 久久精品99国产精品日本| 日韩精品一区国产麻豆| 激情成人综合网| 国产欧美一区二区精品仙草咪| 高清在线成人网| 中文字幕视频一区| 欧美艳星brazzers| 调教+趴+乳夹+国产+精品| 欧美另类久久久品| 久久99久久99| 国产香蕉久久精品综合网| 成人性生交大片免费看中文| 中文字幕精品在线不卡| 91亚洲国产成人精品一区二三| 一区二区在线观看不卡| 欧美日韩精品免费| 国产一区二区三区在线观看免费视频| 国产精品天干天干在线综合| 色噜噜狠狠一区二区三区果冻| 一区二区三区四区av| 欧美妇女性影城| 国产乱子伦一区二区三区国色天香| 国产精品午夜免费| 色av成人天堂桃色av| 亚洲超丰满肉感bbw| 精品久久人人做人人爽| 91啪亚洲精品| 日本在线不卡视频| 国产精品美女久久久久久2018 | 看电影不卡的网站| 欧美激情综合在线| 欧美私人免费视频| 国产精品99久久久久| 亚洲精品乱码久久久久久日本蜜臀| 欧美男生操女生| 国内精品嫩模私拍在线| 亚洲欧美日韩人成在线播放| 欧美一区二区人人喊爽| 成人免费毛片a| 亚洲va欧美va人人爽午夜| 日韩欧美一级精品久久| 色综合天天综合网国产成人综合天| 日一区二区三区| 欧美国产精品专区| 欧美在线你懂得| 国产自产视频一区二区三区| 亚洲美女免费视频| 欧美精品一区二区三区在线播放| 99精品视频在线观看免费| 日韩电影在线一区| 国产精品久久看| 日韩一级大片在线观看| 国产精品精品国产色婷婷| 国产精品高潮呻吟| 国产麻豆9l精品三级站| 亚洲黄色av一区| 久久欧美一区二区| 欧美日韩精品一区二区三区 | jlzzjlzz亚洲女人18| 亚洲成人动漫一区| 国产拍欧美日韩视频二区| 欧美精品色综合| www.亚洲在线| 国产一区激情在线| 亚洲高清中文字幕| 最新成人av在线| 久久久五月婷婷| 91精品蜜臀在线一区尤物| 色婷婷久久久久swag精品| 国产福利91精品一区| 三级久久三级久久久| 亚洲另类在线制服丝袜| 国产三级久久久| 欧美一级久久久| 欧美日韩一区二区三区在线| 成人av集中营| 国产精品538一区二区在线| 日韩av不卡一区二区| 一区二区三区欧美视频| 中文字幕永久在线不卡| 久久精品亚洲乱码伦伦中文 | 日本久久电影网| 国产精品影视网| 毛片不卡一区二区| 日本成人超碰在线观看| 亚洲国产成人av| 一区二区三区高清| 亚洲欧美自拍偷拍色图| 国产精品全国免费观看高清 | 国产精品国产三级国产| 国产三级久久久| 国产亚洲欧美一区在线观看| 精品91自产拍在线观看一区| 欧美精品日韩精品| 欧美日韩一区二区三区高清| 色偷偷88欧美精品久久久| 91在线精品一区二区| 暴力调教一区二区三区| 成人夜色视频网站在线观看| 成人免费高清视频在线观看| 国产精品综合网| 国产成人在线影院| 丁香天五香天堂综合| 国产91在线|亚洲| 高清不卡一区二区在线| 成人午夜电影网站| 成人免费视频一区二区| 成人动漫视频在线| 99精品黄色片免费大全| 99久久99久久综合| 日本道在线观看一区二区| 在线一区二区视频| 国产成人精品综合在线观看| 国产精品一区一区| 国产高清在线精品| 岛国av在线一区| 不卡的av中国片| 91在线看国产| 欧美优质美女网站| 欧美精品自拍偷拍动漫精品| 色婷婷久久久久swag精品| 欧美日韩中文另类| 日韩一级黄色大片| 精品国产免费一区二区三区四区 | 18成人在线观看| 中文字幕在线观看不卡| 亚洲精品成人精品456| 亚洲一区二区影院| 人人超碰91尤物精品国产| 国产一区美女在线| 91丨国产丨九色丨pron| 欧美视频精品在线| 欧美白人最猛性xxxxx69交| 国产喂奶挤奶一区二区三区 | 日韩欧美国产三级电影视频| 精品国产电影一区二区| 国产精品天干天干在观线| 一区二区三区日韩在线观看| 秋霞国产午夜精品免费视频 | 亚洲在线中文字幕| 午夜视频在线观看一区| 狠狠狠色丁香婷婷综合久久五月| 成年人国产精品| 欧美少妇性性性| 久久精品国产一区二区三| 国产福利精品导航| 欧美日韩在线播放三区| 国产亚洲欧洲997久久综合| 一区二区三区欧美亚洲|