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

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

?? mfc教程_ mfc的dll.htm

?? MFC (Microsoft Foundation Class Library)中的各種類結合起來構成了一個應用程序框架
?? HTM
?? 第 1 頁 / 共 2 頁
字號:
<P 
align=justify>該類DLL應用程序動態鏈接到MFC,它輸出的函數僅可以被使用MFC且動態鏈接到MFC的應用程序使用。和規則DLL相比,有以下不同:</P>
<OL>
  <P align=justify>
  <LI>它沒有一個從CWinApp派生的對象; 
  <P></P>
  <P align=justify></P>
  <LI>它必須有一個DllMain函數; 
  <P></P>
  <P align=justify></P>
  <LI>DllMain調用AfxInitExtensionModule函數,必須檢查該函數的返回值,如果返回0,DllMmain也返回0; 
  <P></P>
  <P align=justify></P>
  <LI>如果它希望輸出CRuntimeClass類型的對象或者資源(Resources),則需要提供一個初始化函數來創建一個CDynLinkLibrary對象。并且,有必要把初始化函數輸出。 

  <P></P>
  <P align=justify></P>
  <LI>使用擴展DLL的MFC應用程序必須有一個從CWinApp派生的類,而且,一般在InitInstance里調用擴展DLL的初始化函數。 
  <P></P></LI></OL>
<P align=justify>為什么要這樣做和具體的代碼形式,將在后面9.4.2節說明。</P>
<P align=justify></P>
<P align=justify>MFC類庫也是以DLL的形式提供的。通常所說的動態鏈接到MFC 
的DLL,指的就是實現MFC核心功能的MFCXX.DLL或者MFCXXD.DLL(XX是版本號,XXD表示調試版)。至于提供OLE(MFCOXXD.DLL或者MFCOXX0.DLL)和NET(MFCNXXD.DLL或者MFCNXX.DLL)服務的DLL就是動態鏈接到MFC核心DLL的擴展DLL。</P>
<P align=justify>其實,MFCXX.DLL可以認為是擴展DLL的一個特例,因為它也具備擴展DLL的上述特點。</P>
<OL>
  <OL>
    <P align=justify>
    <LI><A name=_Toc445889074></A><A name=_Toc445782477></A><A 
    name=_Toc452640938></A><A name=_Toc457299036></A><B>DLL的幾點說明</B> 
    <P></P></LI></OL></OL>
<OL>
  <P align=justify>
  <LI>DLL應用程序的入口點是DllMain。 
  <P></P>
  <P align=justify>對程序員來說,DLL應用程序的入口點是DllMain。</P>
  <P 
  align=justify>DllMain負責初始化(Initialization)和結束(Termination)工作,每當一個新的進程或者該進程的新的線程訪問DLL時,或者訪問DLL的每一個進程或者線程不再使用DLL或者結束時,都會調用DllMain。但是,使用TerminateProcess或TerminateThread結束進程或者線程,不會調用DllMain。</P>
  <P align=justify>DllMain的函數原型符合DllEntryPoint的要求,有如下結構:</P>
  <P align=justify>BOOL WINAPI DllMain (HANDLE hInst, </P>
  <P align=justify>ULONG ul_reason_for_call,LPVOID lpReserved)</P>
  <P align=justify>{</P>
  <P align=justify>switch( ul_reason_for_call ) {</P>
  <P align=justify>case DLL_PROCESS_ATTACH:</P>
  <P align=justify>...</P>
  <P align=justify>case DLL_THREAD_ATTACH:</P>
  <P align=justify>...</P>
  <P align=justify>case DLL_THREAD_DETACH:</P>
  <P align=justify>...</P>
  <P align=justify>case DLL_PROCESS_DETACH:</P>
  <P align=justify>...</P>
  <P align=justify>}</P>
  <P align=justify>return TRUE;</P>
  <P align=justify>}</P>
  <P align=justify>其中:</P>
  <P align=justify>參數1是模塊句柄;</P>
  <P 
  align=justify>參數2是指調用DllMain的類別,四種取值:新的進程要訪問DLL;新的線程要訪問DLL;一個進程不再使用DLL(Detach 
  from DLL);一個線程不再使用DLL(Detach from DLL)。</P>
  <P align=justify>參數3保留。</P>
  <P align=justify>如果程序員不指定DllMain,則編譯器使用它自己的DllMain,該函數僅僅返回TRUE。</P>
  <P 
  align=justify>規則DLL應用程序使用了MFC的DllMain,它將調用DLL程序的應用程序對象(從CWinApp派生)的InitInstance函數和ExitInstance函數。</P>
  <P align=justify>擴展DLL必須實現自己的DllMain。</P>
  <P align=justify></P>
  <LI>_DllMainCRTStartup 
  <P></P>
  <P align=justify>為了使用“C”運行庫(CRT,C Run time 
  Library)的DLL版本(多線程),一個DLL應用程序必須指定_DllMainCRTStartup為入口函數,DLL的初始化函數必須是DllMain。</P>
  <P align=justify>_DllMainCRTStartup完成以下任務:當進程或線程捆綁(Attach)到DLL時為“C”運行時的數據(C 
  Runtime Data)分配空間和初始化并且構造全局“C++”對象,當進程或者線程終止使用DLL(Detach)時,清理C Runtime 
  Data并且銷毀全局“C++”對象。它還調用DllMain和RawDllMain函數。</P>
  <P align=justify>RawDllMain在DLL應用程序動態鏈接到MFC 
  DLL時被需要,但它是靜態的鏈接到DLL應用程序的。在講述狀態管理時解釋其原因。</P>
  <P align=justify></P>
  <LI>DLL的函數和數據 
  <P></P>
  <P align=justify>DLL的函數分為兩類:輸出函數和內部函數。輸出函數可以被其他模塊調用,內部函數在定義它們的DLL程序內部使用。</P>
  <P align=justify>雖然DLL可以輸出數據,但一般的DLL程序的數據僅供內部使用。</P>
  <P align=justify></P>
  <P align=justify></P>
  <LI>DLL程序和調用其輸出函數的程序的關系 
  <P></P></LI></OL>
<P align=justify>DLL模塊被映射到調用它的進程的虛擬地址空間。</P>
<P align=justify>DLL使用的內存從調用進程的虛擬地址空間分配,只能被該進程的線程所訪問。</P>
<P align=justify>DLL的句柄可以被調用進程使用;調用進程的句柄可以被DLL使用。</P>
<P align=justify>DLL使用調用進程的棧。</P>
<P 
align=justify>DLL定義的全局變量可以被調用進程訪問;DLL可以訪問調用進程的全局數據。使用同一DLL的每一個進程都有自己的DLL全局變量實例。如果多個線程并發訪問同一變量,則需要使用同步機制;對一個DLL的變量,如果希望每個使用DLL的線程都有自己的值,則應該使用線程局部存儲(TLS,Thread 
Local Strorage)。</P>
<OL>
  <OL>
    <P align=justify>
    <LI><A name=_Toc445889075></A><A name=_Toc445782478></A><A 
    name=_Toc452640939></A><A name=_Toc457299037></A><B>輸出函數的方法</B> 
    <P></P></LI></OL></OL>
<OL>
  <P align=justify>
  <LI>傳統的方法 
  <P></P>
  <P align=justify>在模塊定義文件的EXPORT部分指定要輸入的函數或者變量。語法格式如下:</P>
  <P align=justify>entryname[=internalname] [@ordinal[NONAME]] [DATA] 
  [PRIVATE]</P>
  <P align=justify>其中:</P>
  <P align=justify>entryname是輸出的函數或者數據被引用的名稱;</P>
  <P align=justify>internalname同entryname;</P>
  <P align=justify>@ordinal表示在輸出表中的順序號(index);</P>
  <P align=justify>NONAME僅僅在按順序號輸出時被使用(不使用entryname);</P>
  <P align=justify>DATA表示輸出的是數據項,使用DLL輸出數據的程序必須聲明該數據項為_declspec(dllimport)。</P>
  <P align=justify>上述各項中,只有entryname項是必須的,其他可以省略。</P>
  <P 
  align=justify>對于“C”函數來說,entryname可以等同于函數名;但是對“C++”函數(成員函數、非成員函數)來說,entryname是修飾名。可以從.map映像文件中得到要輸出函數的修飾名,或者使用DUMPBIN 
  /SYMBOLS得到,然后把它們寫在.def文件的輸出模塊。DUMPBIN是VC提供的一個工具。</P>
  <P align=justify>如果要輸出一個“C++”類,則把要輸出的數據和成員的修飾名都寫入.def模塊定義文件。</P>
  <P align=justify></P>
  <LI>在命令行輸出 
  <P></P>
  <P align=justify>對鏈接程序LINK指定/EXPORT命令行參數,輸出有關函數。</P>
  <P align=justify></P>
  <LI>使用MFC提供的修飾符號_declspec(dllexport) 
  <P></P></LI></OL>
<P 
align=justify>在要輸出的函數、類、數據的聲明前加上_declspec(dllexport)的修飾符,表示輸出。MFC提供了一些宏,就有這樣的作用,如表7-2所示。</P>
<P align=center>表7-2 MFC定義的輸入輸出修飾符</P>
<P align=left>
<TABLE cellSpacing=1 cellPadding=7 width=406 border=1>
  <TBODY>
  <TR>
    <TD vAlign=top width="45%">
      <DIR>
      <P align=justify>宏名稱 </P></DIR></TD>
    <TD vAlign=top width="55%">
      <P align=justify>宏內容 </P></TD></TR>
  <TR>
    <TD vAlign=top width="45%">
      <DIR>
      <P align=justify>AFX_CLASS_IMPORT </P></DIR></TD>
    <TD vAlign=top width="55%">
      <P align=justify>__declspec(dllexport) </P></TD></TR>
  <TR>
    <TD vAlign=top width="45%">
      <DIR>
      <P align=justify>AFX_API_IMPORT </P></DIR></TD>
    <TD vAlign=top width="55%">
      <P align=justify>__declspec(dllexport) </P></TD></TR>
  <TR>
    <TD vAlign=top width="45%">
      <DIR>
      <P align=justify>AFX_DATA_IMPORT </P></DIR></TD>
    <TD vAlign=top width="55%">
      <P align=justify>__declspec(dllexport) </P></TD></TR>
  <TR>
    <TD vAlign=top width="45%">
      <DIR>
      <P align=justify>AFX_CLASS_EXPORT </P></DIR></TD>
    <TD vAlign=top width="55%">
      <P align=justify>__declspec(dllexport) </P></TD></TR>
  <TR>
    <TD vAlign=top width="45%">
      <DIR>
      <P align=justify>AFX_API_EXPORT </P></DIR></TD>
    <TD vAlign=top width="55%">
      <P align=justify>__declspec(dllexport) </P></TD></TR>
  <TR>
    <TD vAlign=top width="45%">
      <DIR>
      <P align=justify>AFX_DATA_EXPORT </P></DIR></TD>
    <TD vAlign=top width="55%">
      <P align=justify>__declspec(dllexport) </P></TD></TR>
  <TR>
    <TD vAlign=top width="45%">
      <P align=justify>AFX_EXT_CLASS </P></TD>
    <TD vAlign=top width="55%">
      <P align=justify>#ifdef _AFXEXT</P>
      <P align=justify>AFX_CLASS_EXPORT</P>
      <P align=justify>#else</P>
      <P align=justify>AFX_CLASS_IMPORT </P></TD></TR>
  <TR>
    <TD vAlign=top width="45%">
      <P align=justify>AFX_EXT_API </P></TD>
    <TD vAlign=top width="55%">
      <P align=justify>#ifdef _AFXEXT</P>
      <P align=justify>AFX_API_EXPORT</P>
      <P align=justify>#else</P>
      <P align=justify>AFX_API_IMPORT </P></TD></TR>
  <TR>
    <TD vAlign=top width="45%">
      <P align=justify>AFX_EXT_DATA </P></TD>
    <TD vAlign=top width="55%">
      <P align=justify>#ifdef _AFXEXT</P>
      <P align=justify>AFX_DATA_EXPORT</P>
      <P align=justify>#else</P>
      <P align=justify>AFX_DATA_IMPORT </P></TD></TR>
  <TR>
    <TD vAlign=top width="45%">
      <P align=justify>AFX_EXT_DATADEF </P></TD>
    <TD vAlign=top width="55%"> </TD></TR></TBODY></TABLE>
<P></P>
<P align=justify></P>
<P 
align=justify>像AFX_EXT_CLASS這樣的宏,如果用于DLL應用程序的實現中,則表示輸出(因為_AFX_EXT被定義,通常是在編譯器的標識參數中指定該選項/D_AFX_EXT);如果用于使用DLL的應用程序中,則表示輸入(_AFX_EXT沒有定義)。</P>
<P 
align=justify>要輸出整個的類,對類使用_declspec(_dllexpot);要輸出類的成員函數,則對該函數使用_declspec(_dllexport)。如:</P>
<P align=justify>class AFX_EXT_CLASS CTextDoc : public CDocument</P>
<P align=justify>{</P>
<P align=justify>…</P>
<P align=justify>}</P>
<P align=justify></P>
<P align=justify>extern "C" AFX_EXT_API void WINAPI InitMYDLL();</P>
<P align=justify></P>
<P align=justify>這幾種方法中,最好采用第三種,方便好用;其次是第一種,如果按順序號輸出,調用效率會高些;最次是第二種。</P>
<P align=justify>在“C++”下定義“C”函數,需要加extern “C”關鍵詞。輸出的“C”函數可以從“C”代碼里調用。</P>
<HR>

<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center border=0>
  <TBODY>
  <TR>
    <TD align=middle><A href="http://www.vczx.com/tutorial/mfc/mfc6.php" 
      target=_self>上一章</A> <A href="http://www.vczx.com/tutorial/mfc/mfc.php" 
      target=_self>回目錄</A> <A href="http://www.vczx.com/tutorial/mfc/mfc8.php" 
      target=_self>下一章</A></TD></TR></TBODY></TABLE>
<P>&nbsp;</P>
<P align=justify></P></BODY></HTML>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美丰满美乳xxx高潮www| 国产91丝袜在线观看| 亚洲人成在线播放网站岛国| 国产亚洲欧美色| 国产欧美日韩麻豆91| 蜜乳av一区二区三区| 免费亚洲电影在线| 久久av中文字幕片| 精品一区二区三区影院在线午夜| 男女男精品视频| 国产一区在线观看视频| 国精产品一区一区三区mba桃花 | 99riav久久精品riav| 91丝袜美腿高跟国产极品老师| 色欧美日韩亚洲| 欧美自拍偷拍午夜视频| 69久久夜色精品国产69蝌蚪网| 91精品国产一区二区人妖| 久久婷婷久久一区二区三区| 国产精品毛片高清在线完整版| 亚洲另类春色国产| 免费av成人在线| 成人国产免费视频| 欧美蜜桃一区二区三区| 337p粉嫩大胆色噜噜噜噜亚洲 | 91在线国产福利| 欧美三级韩国三级日本一级| 欧美成人福利视频| 中文字幕亚洲成人| 日本美女一区二区三区视频| 懂色av一区二区夜夜嗨| 欧美美女网站色| 国产精品私房写真福利视频| 婷婷成人激情在线网| 国产成人av一区二区三区在线| 99精品欧美一区二区三区小说| 欧美精品电影在线播放| 欧美国产日韩精品免费观看| 亚洲福利国产精品| 成人午夜在线视频| 91精品在线免费| 亚洲日本免费电影| 国产精品一区二区三区乱码| 欧美日韩精品久久久| 最新成人av在线| 精品一区二区在线看| 欧美日韩国产区一| 亚洲视频一二三| 国产一区二区三区免费| 555夜色666亚洲国产免| 18成人在线观看| 国产一区二区三区美女| 欧美一区二区在线不卡| 亚洲午夜激情av| 色94色欧美sute亚洲线路二 | 欧美一区二区三区公司| 亚洲视频一区在线| 国产白丝网站精品污在线入口| 在线成人av网站| 亚洲国产精品精华液网站| av一二三不卡影片| 国产片一区二区| 裸体在线国模精品偷拍| 91麻豆精品国产91久久久更新时间| 国产高清精品久久久久| 日韩欧美一级片| 蜜桃精品视频在线| 日韩丝袜情趣美女图片| 日本视频在线一区| 欧美一区二区三区男人的天堂| 性久久久久久久| 91精选在线观看| 蜜臀久久99精品久久久画质超高清 | 国产精品中文有码| 欧美成人一区二区| 国产一区二区三区电影在线观看| 欧美精品一区二区三区蜜臀| 国内久久婷婷综合| 精品福利av导航| 国产一区二区成人久久免费影院| 久久精品欧美日韩| 成人av第一页| 亚洲图片自拍偷拍| 制服丝袜一区二区三区| 久久精品国产亚洲高清剧情介绍 | 久久先锋资源网| 国产精品自拍一区| 国产精品久久久久一区二区三区| 成人午夜电影久久影院| 亚洲四区在线观看| 欧美日韩国产免费一区二区| 日本亚洲电影天堂| 久久久国产一区二区三区四区小说| 国产一区二区精品久久99| 国产日韩精品久久久| 色偷偷88欧美精品久久久| 亚洲h动漫在线| 精品国产一区二区三区av性色| 成人做爰69片免费看网站| 亚洲精品国产第一综合99久久 | 日韩欧美三级在线| 国产一区二区三区精品视频| 亚洲欧美电影一区二区| 欧美日韩国产一级片| 日韩av二区在线播放| 国产精品毛片大码女人| 9191久久久久久久久久久| 国产福利精品导航| 亚洲一区二区三区视频在线 | 国产欧美中文在线| 欧美三级资源在线| 国产综合色产在线精品| 亚洲永久精品国产| 国产校园另类小说区| 欧美日韩精品一区二区| 成人avav在线| 狠狠网亚洲精品| 日韩国产在线一| 国产精品白丝在线| 久久久久久9999| 91麻豆精品久久久久蜜臀| 一道本成人在线| 国产a区久久久| 黄色精品一二区| 日韩和欧美的一区| 亚洲一区免费在线观看| 综合自拍亚洲综合图不卡区| 欧美xxxx在线观看| 在线综合+亚洲+欧美中文字幕| 91在线无精精品入口| 国产精品一区免费在线观看| 日产国产高清一区二区三区| 亚洲国产综合人成综合网站| 亚洲欧美一区二区在线观看| 久久久久久久综合| 精品国产乱码久久久久久久| 欧美日韩三级在线| 在线亚洲一区二区| 99在线精品视频| 不卡的电视剧免费网站有什么| 国产精品一品二品| 精品一区二区三区不卡| 免费成人在线影院| 秋霞av亚洲一区二区三| 日韩高清在线不卡| 日产精品久久久久久久性色| 日韩国产精品91| 日本亚洲最大的色成网站www| 丝袜亚洲另类丝袜在线| 五月天亚洲精品| 亚洲成国产人片在线观看| 午夜精品福利一区二区蜜股av| 亚洲一区在线视频观看| 午夜电影一区二区三区| 秋霞影院一区二区| 久久激五月天综合精品| 久久精品噜噜噜成人88aⅴ| 日本欧美一区二区三区乱码| 玖玖九九国产精品| 国产乱码精品一区二区三| 国产成人免费在线观看不卡| 高清beeg欧美| 91女神在线视频| 777午夜精品视频在线播放| 91精品国产91热久久久做人人| 日韩女优毛片在线| 久久婷婷成人综合色| 国产精品国产成人国产三级| 一区二区三区四区蜜桃| 奇米影视一区二区三区小说| 国产精品综合视频| 色婷婷综合在线| 在线不卡一区二区| 久久精品夜色噜噜亚洲aⅴ| 最新国产の精品合集bt伙计| 日韩黄色片在线观看| 国产伦精品一区二区三区在线观看| 99麻豆久久久国产精品免费优播| 在线观看一区不卡| 欧美xxxxx裸体时装秀| 亚洲天堂成人在线观看| 日韩国产精品久久久| 成人avav影音| 欧美一区二区三区免费在线看 | 欧美综合色免费| 久久综合色之久久综合| 一区二区在线观看免费| 极品少妇一区二区| 色婷婷综合久久久久中文一区二区 | 国产精品一区二区久久精品爱涩| 99热这里都是精品| 欧美成人a∨高清免费观看| 自拍av一区二区三区| 久久激情五月激情| 91久久精品一区二区二区| 久久久亚洲欧洲日产国码αv| 亚洲综合激情网| 成人av在线影院| 日韩欧美亚洲国产另类| 亚洲电影一区二区|