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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mfc教程7_ mfc的dll.htm

?? 此文件是將MFC在線教程的14個網頁打包
?? 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.3157" 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的有關知識較多,而介紹MFC的書則比較少地提到。即使使用MFC來編寫動態鏈接庫,對于初步接觸DLL的程序員來說,了解DLL的背景知識是必要的。另外,MFC提供了新的手段來幫助編寫DLL程序。所以,本節先簡潔的介紹有關概念。</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>靜態鏈接和動態鏈接 
  <P></P></LI></OL>
<P align=justify>當前鏈接的目標代碼(.obj)如果引用了一個函數卻沒有定義它,鏈接程序可能通過兩種途徑來解決這種從外部對該函數的引用:</P>
<UL>
  <P align=justify>
  <LI>靜態鏈接 
  <P></P></LI></UL>
<P 
align=justify>鏈接程序搜索一個或者多個庫文件(標準庫.lib),直到在某個庫中找到了含有所引用函數的對象模塊,然后鏈接程序把這個對象模塊拷貝到結果可執行文件(.exe)中。鏈接程序維護對該函數的所有引用,使它們指向該程序中現在含有該函數拷貝的地方。</P>
<UL>
  <P align=justify>
  <LI>動態鏈接 
  <P></P></LI></UL>
<P 
align=justify>鏈接程序也是搜索一個或者多個庫文件(輸入庫.lib),當在某個庫中找到了所引用函數的輸入記錄時,便把輸入記錄拷貝到結果可執行文件中,產生一次對該函數的動態鏈接。這里,輸入記錄不包含函數的代碼或者數據,而是指定一個包含該函數代碼以及該函數的順序號或函數名的動態鏈接庫。</P>
<P 
align=justify>當程序運行時,Windows裝入程序,并尋找文件中出現的任意動態鏈接。對于每個動態鏈接,Windows裝入指定的DLL并且把它映射到調用進程的虛擬地址空間(如果沒有映射的話)。因此,調用和目標函數之間的實際鏈接不是在鏈接應用程序時一次完成的(靜態),相反,是運行該程序時由Windows完成的(動態)。</P>
<P align=justify>這種動態鏈接稱為加載時動態鏈接。還有一種動態鏈接方式下面會談到。</P>
<OL>
  <P align=justify>
  <LI>動態鏈接的方法 
  <P></P></LI></OL>
<P align=justify>鏈接動態鏈接庫里的函數的方法如下:</P>
<UL>
  <P align=justify>
  <LI>加載時動態鏈接(Load_time dynamic linking) 
  <P></P></LI></UL>
<P align=justify>如上所述。Windows搜索要裝入的DLL時,按以下順序:</P>
<P align=justify>應用程序所在目錄→當前目錄→Windows SYSTEM目錄→Windows目錄→PATH環境變量指定的路徑。</P>
<UL>
  <P align=justify>
  <LI>運行時動態鏈接(Run_time dynamic linking) 
  <P></P></LI></UL>
<P 
align=justify>程序員使用LoadLibrary把DLL裝入內存并且映射DLL到調用進程的虛擬地址空間(如果已經作了映射,則增加DLL的引用計數)。首先,LoadLibrary搜索DLL,搜索順序如同加載時動態鏈接一樣。然后,使用GetProcessAddress得到DLL中輸出函數的地址,并調用它。最后,使用FreeLibrary減少DLL的引用計數,當引用計數為0時,把DLL模塊從當前進程的虛擬空間移走。</P>
<OL>
  <P align=justify>
  <LI>輸入庫(.lib): 
  <P></P>
  <P align=justify>輸入庫以.lib為擴展名,格式是COFF(Common object file 
  format)。COFF標準庫(靜態鏈接庫)的擴展名也是.lib。COFF格式的文件可以用dumpbin來查看。</P>
  <P 
  align=justify>輸入庫包含了DLL中的輸出函數或者輸出數據的動態鏈接信息。當使用MFC創建DLL程序時,會生成輸入庫(.lib)和動態鏈接庫(.dll)。</P>
  <P align=justify></P>
  <LI>輸出文件(.exp) 
  <P></P>
  <P align=justify>輸出文件以.exp為擴展名,包含了輸出的函數和數據的信息,鏈接程序使用它來創建DLL動態鏈接庫。</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>它可以用來創建輸入庫和輸出文件。通常,不用使用lib.exe,如果工程目標是創建DLL程序,鏈接程序會完成輸入庫的創建。</P>
  <P align=justify>更詳細的信息可以參見MFC使用手冊和文檔。</P>
  <P align=justify></P>
  <LI>鏈接規范(Linkage Specification ) 
  <P></P>
  <P 
  align=justify>這是指鏈接采用不同編程語言寫的函數(Function)或者過程(Procedure)的鏈接協議。MFC所支持的鏈接規范是“C”和“C++”,缺省的是“C++”規范,如果要聲明一個“C”鏈接的函數或者變量,則一般采用如下語法:</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>//函數聲明(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標準頭文件都是用如上語法聲明的,這樣它們在C++環境下可以使用。</P>
  <P align=justify></P>
  <LI>修飾名(Decoration name) 
  <P></P></LI></OL>
<P 
align=justify>“C”或者“C++”函數在內部(編譯和鏈接)通過修飾名識別。修飾名是編譯器在編譯函數定義或者原型時生成的字符串。有些情況下使用函數的修飾名是必要的,如在模塊定義文件里頭指定輸出“C++”重載函數、構造函數、析構函數,又如在匯編代碼里調用“C””或“C++”函數等。</P>
<P align=justify>修飾名由函數名、類名、調用約定、返回類型、參數等共同決定。</P>
<OL>
  <OL>
    <P align=justify>
    <LI><A name=_Toc445889071></A><A name=_Toc445782474></A><A 
    name=_Toc452640935></A><A name=_Toc457299034></A><B>調用約定</B> 
    <P></P></LI></OL></OL>
<P align=justify>調用約定(Calling 
convention)決定以下內容:函數參數的壓棧順序,由調用者還是被調用者把參數彈出棧,以及產生函數修飾名的方法。MFC支持以下調用約定:</P>
<OL>
  <P align=justify>
  <LI>_cdecl 
  <P></P>
  <P 
  align=justify>按從右至左的順序壓參數入棧,由調用者把參數彈出棧。對于“C”函數或者變量,修飾名是在函數名前加下劃線。對于“C++”函數,有所不同。</P>
  <P align=justify>如函數void 
  test(void)的修飾名是_test;對于不屬于一個類的“C++”全局函數,修飾名是?test@@ZAXXZ。</P>
  <P align=justify>這是MFC缺省調用約定。由于是調用者負責把參數彈出棧,所以可以給函數定義個數不定的參數,如printf函數。</P>
  <P align=justify></P>
  <LI>_stdcall 
  <P></P>
  <P 
  align=justify>按從右至左的順序壓參數入棧,由被調用者把參數彈出棧。對于“C”函數或者變量,修飾名以下劃線為前綴,然后是函數名,然后是符號“@”及參數的字節數,如函數int 
  func(int a, double b)的修飾名是_func@12。對于“C++”函數,則有所不同。</P>
  <P align=justify>所有的Win32 API函數都遵循該約定。</P>
  <P align=justify></P>
  <LI>_fastcall 
  <P></P>
  <P 
  align=justify>頭兩個DWORD類型或者占更少字節的參數被放入ECX和EDX寄存器,其他剩下的參數按從右到左的順序壓入棧。由被調用者把參數彈出棧,對于“C”函數或者變量,修飾名以“@”為前綴,然后是函數名,接著是符號“@”及參數的字節數,如函數int 
  func(int a, double b)的修飾名是@func@12。對于“C++”函數,有所不同。</P>
  <P align=justify>未來的編譯器可能使用不同的寄存器來存放參數。</P>
  <P align=justify></P>
  <LI>thiscall 
  <P></P>
  <P 
  align=justify>僅僅應用于“C++”成員函數。this指針存放于CX寄存器,參數從右到左壓棧。thiscall不是關鍵詞,因此不能被程序員指定。</P>
  <P align=justify></P>
  <LI>naked call 
  <P></P>
  <P 
  align=justify>采用1-4的調用約定時,如果必要的話,進入函數時編譯器會產生代碼來保存ESI,EDI,EBX,EBP寄存器,退出函數時則產生代碼恢復這些寄存器的內容。naked 
  call不產生這樣的代碼。</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>過時的調用約定 
  <P></P></LI></OL>
<P align=justify>原來的一些調用約定可以不再使用。它們被定義成調用約定_stdcall或者_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顯示了一個函數在幾種調用約定下的修飾名(表中的“C++”函數指的是“C++”全局函數,不是成員函數),函數原型是void 
CALLTYPE test(void),CALLTYPE可以是_cdecl、_fastcall、_stdcall。</P>
<P align=center>表7-1 不同調用約定下的修飾名</P>
<P align=center>
<CENTER>
<TABLE cellSpacing=1 cellPadding=7 width=487 border=1>
  <TBODY>
  <TR>
    <TD vAlign=top width="24%">
      <P align=justify>調用約定 </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編譯開關 </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應用程序的類型</B> 
      <P></P></LI></OL></OL></OL>
<OL>
  <P align=justify>
  <LI>靜態鏈接到MFC的規則DLL應用程序 
  <P></P>
  <P align=justify>該類DLL應用程序里頭的輸出函數可以被任意Win32程序使用,包括使用MFC的應用程序。輸入函數有如下形式:</P>
  <P align=justify>extern "C" EXPORT YourExportedFunction( );</P>
  <P align=justify>如果沒有extern “C”修飾,輸出函數僅僅能從C++代碼中調用。</P>
  <P align=justify>DLL應用程序從CWinApp派生,但沒有消息循環。</P>
  <P align=justify></P>
  <LI>動態鏈接到MFC的規則DLL應用程序 
  <P></P>
  <P 
  align=justify>該類DLL應用程序里頭的輸出函數可以被任意Win32程序使用,包括使用MFC的應用程序。但是,所有從DLL輸出的函數應該以如下語句開始:</P>
  <P align=justify>AFX_MANAGE_STATE(AfxGetStaticModuleState( ))</P>
  <P align=justify>此語句用來正確地切換MFC模塊狀態。關于MFC的模塊狀態,后面第9章有詳細的討論。</P>
  <P align=justify>其他方面同靜態鏈接到MFC的規則DLL應用程序。</P>
  <P align=justify></P>
  <LI>擴展DLL應用程序 
  <P></P></LI></OL>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品网站在线| av亚洲精华国产精华| 日本大香伊一区二区三区| 久久影院视频免费| 狠狠色2019综合网| 日韩欧美成人激情| 精品亚洲国内自在自线福利| 91久久精品国产91性色tv| 亚洲欧美日韩中文播放| 色一区在线观看| 亚洲欧美日韩久久| 欧美无砖砖区免费| 天堂一区二区在线免费观看| 欧美一区二区网站| 久久99久久99小草精品免视看| 欧美不卡在线视频| 国产美女视频91| 精品国产成人在线影院 | 欧美日韩国产另类不卡| 亚洲国产精品自拍| 色综合天天综合网天天看片| 国产精品美女久久久久av爽李琼| 成人av电影免费观看| 亚洲美女少妇撒尿| 91精品国产全国免费观看| 裸体一区二区三区| 欧美国产日韩一二三区| 91美女片黄在线观看91美女| 亚洲国产精品一区二区久久| 欧美一卡二卡在线| 国产乱码精品1区2区3区| 中文字幕第一页久久| 色狠狠一区二区三区香蕉| 日韩国产在线一| 国产亚洲一二三区| 97久久久精品综合88久久| 亚洲电影在线播放| 26uuu欧美日本| 91女厕偷拍女厕偷拍高清| 日韩精品一二三| 国产精品入口麻豆九色| 精品视频全国免费看| 国产激情一区二区三区| 亚洲欧美一区二区三区国产精品| 69堂成人精品免费视频| 欧美一区二区国产| 国产一区欧美二区| 亚洲永久免费av| 欧美国产乱子伦| 亚洲第一电影网| 国产91高潮流白浆在线麻豆| 2020国产精品久久精品美国| 看电视剧不卡顿的网站| 精品国产一区a| 国产一区二区三区视频在线播放| 久久综合九色综合欧美就去吻| 日韩av一二三| 91久久精品网| 国产精品久久久久久久久免费丝袜 | 国产精品国产馆在线真实露脸| 国产二区国产一区在线观看| 国产精品久久毛片| 9久草视频在线视频精品| 久久久久一区二区三区四区| 国产成人啪免费观看软件 | 国产91丝袜在线播放0| 日本一区二区电影| 91福利资源站| 亚洲国产视频一区| 欧美一区三区二区| 国产成人在线视频网址| 亚洲青青青在线视频| 欧美麻豆精品久久久久久| 国产在线精品不卡| 日韩一区二区三区免费观看| 国产二区国产一区在线观看| 亚洲视频中文字幕| 91精品综合久久久久久| 国产91精品露脸国语对白| 亚洲国产综合在线| 久久精品欧美一区二区三区麻豆| 激情成人午夜视频| 亚洲摸摸操操av| 日韩欧美一级片| 91啪亚洲精品| 精品一区免费av| 亚洲精品成a人| 日韩亚洲欧美成人一区| 国产成人午夜电影网| 午夜欧美一区二区三区在线播放| 久久先锋资源网| 成人综合婷婷国产精品久久蜜臀| 午夜久久久久久久久 | 91久久线看在观草草青青| 日韩国产精品大片| 亚洲丝袜制服诱惑| 国产视频一区在线播放| 在线不卡免费av| 色综合欧美在线视频区| 国产一区二区伦理| 日韩一区精品字幕| 亚洲精品欧美在线| 欧美极品少妇xxxxⅹ高跟鞋 | 成人免费看片app下载| 另类小说图片综合网| 亚洲一区精品在线| 国产精品私房写真福利视频| 欧美成人官网二区| 6080日韩午夜伦伦午夜伦| 94-欧美-setu| av一二三不卡影片| 成人a级免费电影| 国产一区二区三区综合| 一区二区三国产精华液| 久久久久久久久久久99999| 欧美一区二区三区免费在线看 | 国产精品理伦片| 久久精品视频网| 久久免费看少妇高潮| 日韩精品一区二区在线观看| 亚洲人妖av一区二区| 在线不卡a资源高清| 色欧美88888久久久久久影院| 91浏览器入口在线观看| 欧美色精品在线视频| 欧美一区二区在线免费观看| 欧美不卡一区二区三区四区| 欧美www视频| 国产欧美精品一区二区色综合 | 另类专区欧美蜜桃臀第一页| 久色婷婷小香蕉久久| 国产精品综合av一区二区国产馆| 国产91对白在线观看九色| 91色婷婷久久久久合中文| 精品视频999| 久久久久久亚洲综合影院红桃| 国产精品私人自拍| 亚洲国产日日夜夜| 国内精品久久久久影院色| 北岛玲一区二区三区四区| 在线免费观看视频一区| 日韩精品专区在线影院重磅| 国产精品色眯眯| 亚洲国产cao| 国产精品911| 欧美影片第一页| 精品国产3级a| 亚洲一区在线观看免费 | 日韩中文字幕麻豆| 国产在线精品一区二区| 在线观看日韩电影| 久久久久久久久久久黄色| 亚洲精品伦理在线| 久久精品国产77777蜜臀| 不卡大黄网站免费看| 欧美一区二区三区在线观看视频| 国产午夜三级一区二区三| 午夜一区二区三区视频| 国产91在线看| 日韩三级.com| 亚洲综合色婷婷| 粗大黑人巨茎大战欧美成人| 91精品麻豆日日躁夜夜躁| 日韩美女视频一区二区| 国产一区二区毛片| 欧美日本一区二区三区四区| 国产精品成人免费在线| 韩国成人福利片在线播放| 在线视频观看一区| 国产精品第五页| 国产电影一区在线| 欧美一级免费大片| 曰韩精品一区二区| 成人免费黄色在线| 久久久99免费| 狠狠色伊人亚洲综合成人| 欧美日韩国产首页在线观看| 亚洲日本电影在线| 国产高清不卡一区| 久久久噜噜噜久久中文字幕色伊伊| 亚洲不卡在线观看| 欧美怡红院视频| 亚洲精品日韩综合观看成人91| 国产成人福利片| 国产三级精品三级在线专区| 九色|91porny| 日韩亚洲国产中文字幕欧美| 三级不卡在线观看| 欧美精品vⅰdeose4hd| 亚洲精品国产精华液| 91在线云播放| 亚洲精品ww久久久久久p站| 91香蕉视频在线| 亚洲色图.com| 色噜噜狠狠一区二区三区果冻| 国产精品成人免费精品自在线观看| 国产91精品久久久久久久网曝门| 国产欧美中文在线| 成人开心网精品视频| 中文字幕一区二区三区不卡在线|