青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

我希望你是我獨(dú)家記憶

一段永遠(yuǎn)封存的記憶,隨風(fēng)而去
posts - 263, comments - 31, trackbacks - 0, articles - 3
   :: 首頁(yè) :: 新隨筆 ::  :: 聚合  :: 管理

DLLMain簡(jiǎn)單介紹

Posted on 2009-12-04 15:05 Hero 閱讀(1227) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++

1   DLL的進(jìn)入/退出函數(shù)

1.1 DllMain簡(jiǎn)介

跟exe有個(gè)main或者WinMain入口函數(shù)一樣,DLL也有一個(gè)入口函數(shù),就是DllMain。以“DllMain”為關(guān)鍵字,來(lái)看看MSDN幫助文檔怎么介紹這個(gè)函數(shù)的。

The DllMain function is an optional method of entry into a dynamic-link library (DLL)。(簡(jiǎn)要翻譯:對(duì)于動(dòng)態(tài)鏈接庫(kù),DllMain是一個(gè)可選的入口函數(shù)。)這句話很重要,很多初學(xué)者可能都認(rèn)為一個(gè)動(dòng)態(tài)鏈接庫(kù)肯定要有DllMain函數(shù)。其實(shí)不然,像很多僅僅包含資源信息的DLL是沒有DllMain函數(shù)的。

1.2 何時(shí)調(diào)用DllMain

       系統(tǒng)是在什么時(shí)候調(diào)用DllMain函數(shù)的呢?靜態(tài)鏈接時(shí),或動(dòng)態(tài)鏈接時(shí)調(diào)用LoadLibrary和FreeLibrary都會(huì)調(diào)用DllMain函數(shù)。DllMain的第三個(gè)參數(shù)fdwReason指明了系統(tǒng)調(diào)用Dll的原因,它可能是:

DLL_PROCESS_ATTACH、

DLL_PROCESS_DETACH、

DLL_THREAD_ATTACH

DLL_THREAD_DETACH。

以下從這四種情況來(lái)分析系統(tǒng)何時(shí)調(diào)用了DllMain。            

1.2.1 DLL_PROCESS_ATTACH

       大家都知道,一個(gè)程序要調(diào)用Dll里的函數(shù),首先要先把DLL文件映射到進(jìn)程的地址空間。要把一個(gè)DLL文件映射到進(jìn)程的地址空間,有兩種方法:靜態(tài)鏈接和動(dòng)態(tài)鏈接的LoadLibrary或者LoadLibraryEx。

       當(dāng)一個(gè)DLL文件被映射到進(jìn)程的地址空間時(shí),系統(tǒng)調(diào)用該DLL的DllMain函數(shù),傳遞的fdwReason參數(shù)為DLL_PROCESS_ATTACH。這種調(diào)用只會(huì)發(fā)生在第一次映射時(shí)。如果同一個(gè)進(jìn)程后來(lái)為已經(jīng)映射進(jìn)來(lái)的DLL再次調(diào)用LoadLibrary或者LoadLibraryEx,操作系統(tǒng)只會(huì)增加DLL的使用次數(shù),它不會(huì)再用DLL_PROCESS_ATTACH調(diào)用DLL的DllMain函數(shù)。不同進(jìn)程用LoadLibrary同一個(gè)DLL時(shí),每個(gè)進(jìn)程的第一次映射都會(huì)用DLL_PROCESS_ATTACH調(diào)用DLL的DllMain函數(shù)。

       可參考DllMainTest的DLL_PROCESS_ATTACH_Test函數(shù)。

1.2.2 DLL_PROCESS_DETACH

       當(dāng)DLL被從進(jìn)程的地址空間解除映射時(shí),系統(tǒng)調(diào)用了它的DllMain,傳遞的fdwReason值是DLL_PROCESS_DETACH。當(dāng)DLL處理該值時(shí),它應(yīng)該執(zhí)行進(jìn)程相關(guān)的清理工作。

       那么什么時(shí)候DLL被從進(jìn)程的地址空間解除映射呢??jī)煞N情況:

       ◆FreeLibrary解除DLL映射(有幾個(gè)LoadLibrary,就要有幾個(gè)FreeLibrary

       ◆進(jìn)程結(jié)束而解除DLL映射,在進(jìn)程結(jié)束前還沒有解除DLL的映射,進(jìn)程結(jié)束后會(huì)解除DLL映射。(如果進(jìn)程的終結(jié)是因?yàn)檎{(diào)用了TerminateProcess,系統(tǒng)就不會(huì)用DLL_PROCESS_DETACH來(lái)調(diào)用DLL的DllMain函數(shù)。這就意味著DLL在進(jìn)程結(jié)束前沒有機(jī)會(huì)執(zhí)行任何清理工作。)

       注意:當(dāng)用DLL_PROCESS_ATTACH調(diào)用DLL的DllMain函數(shù)時(shí),如果返回FALSE,說(shuō)明沒有初始化成功,系統(tǒng)仍會(huì)用DLL_PROCESS_DETACH調(diào)用DLL的DllMain函數(shù)。因此,必須確保清理那些沒有成功初始化的東西。

       可參考DllMainTest的DLL_PROCESS_DETACH_Test函數(shù)。

1.2.3 DLL_THREAD_ATTACH

       當(dāng)進(jìn)程創(chuàng)建一線程時(shí),系統(tǒng)查看當(dāng)前映射到進(jìn)程地址空間中的所有DLL文件映像,并用值DLL_THREAD_ATTACH調(diào)用DLL的DllMain函數(shù)。

新創(chuàng)建的線程負(fù)責(zé)執(zhí)行這次的DLL的DllMain函數(shù),只有當(dāng)所有的DLL都處理完這一通知后,系統(tǒng)才允許進(jìn)程開始執(zhí)行它的線程函數(shù)。

注意跟DLL_PROCESS_ATTACH的區(qū)別,我們?cè)谇懊嬲f(shuō)過,第n(n>=2)次以后地把DLL映像文件映射到進(jìn)程的地址空間時(shí),是不再用DLL_PROCESS_ATTACH調(diào)用DllMain的。而DLL_THREAD_ATTACH不同,進(jìn)程中的每次建立線程,都會(huì)用值DLL_THREAD_ATTACH調(diào)用DllMain函數(shù),哪怕是線程中建立線程也一樣。

1.2.4 DLL_THREAD_DETACH

       如果線程調(diào)用了ExitThread來(lái)結(jié)束線程(線程函數(shù)返回時(shí),系統(tǒng)也會(huì)自動(dòng)調(diào)用ExitThread),系統(tǒng)查看當(dāng)前映射到進(jìn)程空間中的所有DLL文件映像,并用DLL_THREAD_DETACH來(lái)調(diào)用DllMain函數(shù),通知所有的DLL去執(zhí)行線程級(jí)的清理工作。

       注意:如果線程的結(jié)束是因?yàn)橄到y(tǒng)中的一個(gè)線程調(diào)用了TerminateThread,系統(tǒng)就不會(huì)用值DLL_THREAD_DETACH來(lái)調(diào)用所有DLL的DllMain函數(shù)。

1.3 為DllMain換名

在早期的SDK版本中,DllMain是叫做DllEntryPoint。其實(shí)有一件鮮為人知的事:一個(gè)Dll的入口函數(shù)名是可以自己定義的。下面我將以VC++6.0為例來(lái)演示如何更改。首先要說(shuō)明一點(diǎn),雖然DllMain可以換成其他函數(shù)名,但函數(shù)的參數(shù)和返回值必須和DllMain一樣。而且這個(gè)函數(shù)要為__stdcall類型(DllMain本身也是__stdcall類型)。

打開VC++菜單Project\Settings\Link tab\ Output in the Category box,如下圖,在Entry-point symbol中輸入要替換DllMain的函數(shù)名(當(dāng)然這個(gè)函數(shù)名是你程序中已經(jīng)實(shí)現(xiàn)的函數(shù))。Entry-point symbol是干么的呢?可以以關(guān)鍵字“Entry-point symbol”搜索MSDN幫助文檔查看,搜索時(shí),打鉤“僅搜索標(biāo)題”會(huì)更快定位。

DllMain詳解 - 生活 - 無(wú)敵

         按OK后,如果馬上編譯的話會(huì)出現(xiàn)如下錯(cuò)誤:

LIBCMTD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

Debug/Dll.dll : fatal error LNK1120: 1 unresolved externals

打開VC++菜單Project\Settings\C/C++選項(xiàng)卡,如下圖,在Project Options:末尾的地方添加”/D”(圖中藍(lán)色高亮的地方),要注意位置,我試了,要把/D放到/GZ后面也會(huì)鏈接錯(cuò)誤,我也不懂為什么,^_^。按OK,再次編譯,成功。大家可以自己測(cè)試下到底有沒有更改成功,什么,如果測(cè)試?打出調(diào)式信息啊。

DllMain詳解 - 生活 - 無(wú)敵

1.4 DisableThreadLibraryCalls

看幫助就知道它是干么用的:

The DisableThreadLibraryCalls function disables the DLL_THREAD_ATTACH and DLL_THREAD_DETACH notifications for the dynamic-link library (DLL) specified by hLibModule. This can reduce the size of the working code set for some applications.

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美精品一区二区三区在线看午夜| 麻豆久久久9性大片| 国产精品美女久久久免费| 欧美三级电影大全| 99精品黄色片免费大全| 亚洲欧美区自拍先锋| 亚洲欧美日韩国产成人精品影院| 一区二区三区日韩欧美精品| 亚洲一区二区三区在线看| 亚洲欧美综合| 久久久久久综合网天天| 欧美va亚洲va香蕉在线| 亚洲国产福利在线| 亚洲精品视频免费| 亚洲午夜一区二区| 久久精品国产免费看久久精品| 久久一区二区三区超碰国产精品| 欧美激情国产高清| 国产欧美日韩视频在线观看| 亚洲第一免费播放区| 亚洲色在线视频| 美女主播视频一区| 一本久久综合| 久久综合狠狠综合久久综青草 | 欧美与欧洲交xxxx免费观看 | 国产精品v欧美精品v日韩精品| 国产精品视频内| 亚洲欧洲一区二区三区| 小嫩嫩精品导航| 亚洲国产91| 性久久久久久久| 欧美精品日韩精品| 国内精品免费在线观看| 亚洲一区二区三区午夜| 欧美岛国在线观看| 亚洲欧美中文日韩在线| 欧美国产三区| 在线国产精品播放| 亚洲欧美高清| 欧美成人69av| 亚洲欧美日韩综合| 欧美日韩精品在线视频| 亚洲国产小视频在线观看| 欧美一区二区大片| 亚洲理论在线| 欧美福利影院| 91久久精品日日躁夜夜躁欧美 | 国产美女扒开尿口久久久| 亚洲人被黑人高潮完整版| 久久久成人精品| 亚洲欧美日韩一区| 国产精品理论片| 亚洲免费视频在线观看| 最新69国产成人精品视频免费| 久久久久国产精品人| 亚洲激情在线视频| 农夫在线精品视频免费观看| 亚洲欧美不卡| 国产精品久久久久免费a∨| 亚洲乱码精品一二三四区日韩在线| 乱码第一页成人| 久久精品免费电影| 激情综合久久| 欧美xart系列高清| 欧美freesex8一10精品| 亚洲精选在线| 亚洲欧洲在线视频| 欧美女主播在线| 一区二区三区**美女毛片| 亚洲激情视频网站| 欧美日韩三区| 小处雏高清一区二区三区| 亚洲一区二区高清| 国产亚洲在线| 免费一级欧美在线大片| 免费人成精品欧美精品| 亚洲人在线视频| 亚洲精品久久久久久久久| 欧美日韩美女一区二区| 制服丝袜激情欧洲亚洲| 一区二区高清在线观看| 国产精品三上| 麻豆精品传媒视频| 欧美激情精品久久久久久变态| 亚洲美女性视频| aaa亚洲精品一二三区| 国产欧美精品日韩精品| 欧美凹凸一区二区三区视频| 欧美成人精品三级在线观看| 一区二区三区精品视频| 午夜精彩视频在线观看不卡 | 亚洲精品免费一二三区| 亚洲欧洲三级电影| 国产精品久久久久77777| 久久久国产一区二区三区| 两个人的视频www国产精品| 夜夜嗨av一区二区三区四区| 亚洲影院一区| 亚洲电影视频在线| 一本久道综合久久精品| 国产一区二区三区在线观看视频 | 亚洲精品一区二区三区蜜桃久| 欧美亚州在线观看| 美日韩精品免费| 国产精品成人播放| 欧美国产亚洲另类动漫| 国产精品你懂的在线| 欧美大片在线看| 国产日韩一区二区三区在线播放 | 久久久国产精品一区二区中文 | 先锋亚洲精品| 亚洲国产精品久久| 亚洲系列中文字幕| 亚洲欧洲日韩在线| 亚洲欧美一区二区激情| 99ri日韩精品视频| 久久人人超碰| 欧美一级大片在线免费观看| 欧美暴力喷水在线| 久久伊人亚洲| 国产精品一区二区在线观看网站| 亚洲大胆人体视频| 国产一区二区三区在线免费观看| 日韩一级精品| 日韩香蕉视频| 欧美极品一区| 亚洲国产精品va在线观看黑人| 国语自产精品视频在线看抢先版结局 | 国产精品午夜春色av| 亚洲九九精品| 99v久久综合狠狠综合久久| 欧美freesex交免费视频| 欧美国产精品久久| 樱桃成人精品视频在线播放| 性欧美大战久久久久久久久| 亚洲免费影视第一页| 欧美日韩综合在线| 一区二区三区精品视频| 亚洲视频在线观看网站| 欧美日韩裸体免费视频| 日韩一区二区免费高清| 亚洲特色特黄| 国产精品家庭影院| 亚洲综合成人婷婷小说| 午夜精品视频网站| 国产色视频一区| 久久精品国产亚洲a| 欧美电影免费观看| 亚洲美女在线看| 欧美日韩在线视频观看| 亚洲午夜精品国产| 久久精品一区二区| 亚洲第一精品夜夜躁人人躁| 欧美大胆人体视频| 亚洲九九爱视频| 性欧美video另类hd性玩具| 国产日韩成人精品| 麻豆国产精品va在线观看不卡| 亚洲高清在线视频| 一本色道久久99精品综合| 国产精品久久久久久av福利软件 | 亚洲国产精品久久久久秋霞不卡| 亚洲麻豆国产自偷在线| 欧美天堂亚洲电影院在线播放| 精品va天堂亚洲国产| 免费精品视频| 夜夜嗨网站十八久久 | 亚洲丰满在线| 亚洲特黄一级片| 国产夜色精品一区二区av| 久久日韩精品| 99精品欧美一区二区三区| 久久精品九九| 一本大道久久a久久精二百| 国产亚洲一区二区在线观看| 免费亚洲电影在线观看| 亚洲小视频在线| 欧美福利一区二区| 午夜久久tv| 亚洲人成绝费网站色www| 国产精品亚洲不卡a| 欧美成人一区二区三区片免费 | 欧美日韩在线高清| 久久国产精品99久久久久久老狼| 亚洲高清视频一区| 欧美在线播放一区| 在线一区二区三区做爰视频网站| 国产亚洲一区二区三区| 欧美三日本三级三级在线播放| 久久久久久成人| 午夜精品一区二区三区在线| 亚洲精品久久7777| 蜜桃av一区二区三区| 欧美一区二区啪啪| 夜夜嗨av一区二区三区四区| 在线播放中文字幕一区| 国产午夜精品久久久久久久| 国产精品爱啪在线线免费观看| 欧美成人午夜影院| 老司机精品福利视频|