日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DLL入口点函数DllMain

發布時間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DLL入口点函数DllMain 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


每個DLL都可以有一個入口點函數DllMain,系統會在不同的時刻調用此函數。以下是DllMain的一般形式:

BOOL WINAPI DllMain(HINSTANCE hinstDLL, // handle to DLL moduleDWORD fdwReason, // reason for calling functionLPVOID lpReserved ) // reserved {// Perform actions based on the reason for calling.switch( fdwReason ) { case DLL_PROCESS_ATTACH:// Initialize once for each new process.// Return FALSE to fail DLL load.break;case DLL_THREAD_ATTACH:// Do thread-specific initialization.break;case DLL_THREAD_DETACH:// Do thread-specific cleanup.break;case DLL_PROCESS_DETACH:// Perform any necessary cleanup.break;}return TRUE; // Successful DLL_PROCESS_ATTACH. } 以上代碼摘自MSDN,幾乎所有的DllMain都以這種形式呈現。 先來看一下這個函數傳遞進來的參數: 1、 HINSTANCE hinstDLL 這個參數是該DLL實例的句柄,也就是此DLL映射到進程地址空間后,在該進程地址空間中的位置。 2、 DWORD fdwReason 此參數標示了調用DllMain函數的原因。有四種值,就是函數中case后的取值。各個取值的含義,稍后論述。 3、 LPVOID lpReserved 保留。 現在我們來討論一下fdwReason的四種取值,這些取值,也直接反映了操作系統會在何種情況下調用DllMain。 1、DLL_PROCESS_ATTACH 當系統第一次將一個DLL映射到進程地址空間中時,會調用DllMain,并為fdwReason傳入DLL_PROCESS_ATTACH。 注意,只有在第一次映射的時候,才會這樣。如之后,另一線程再次顯式加載此DLL,則操作系統只是增加該DLL的使用計數,而不會再次使用DLL_PROCESS_ATTACH來調用DllMain。 對DLL_PROCESS_ATTACH的處理,代表了DLL的初始化。 DllMain的返回值,也是針對DLL_PROCESS_ATTACH消息的。對于其余的三種取值,不起作用。 對于隱式加載,如DllMain返回FALSE,則程序會啟動失敗。對于顯式加載,則會使LoadLibrary返回NULL。 2、DLL_PROCESS_DETACH 當系統將一個DLL從進程地址空間中撤銷映射時,則會向DllMain傳入DLL_PROCESS_DETACH。我們應當在此處放置一些清理代碼。 當使用FreeLibrary時,如該線程的使用計數為0時,操作系統才會使用DLL_PROCESS_DETACH來調用DllMain。如使用計數大于0,則只是單純的減少該DLL的計數。 3、DLL_THREAD_ATTACH 當進程創建一個線程,則系統會檢查當前已映射到該進程空間中的所有DLL映像,并用DLL_THREAD_ATTACH來調用每個DLL的DllMain。 只有當所有DLL都完成了對DLL_THREAD_ATTACH的處理后,新線程才會執行它的線程函數。 另外,主線程不可能用DLL_THREAD_ATTACH來調用DllMain,因為主線程必然是在進程初始化的時候,用DLL_PROCESS_ATTACH調用DllMain的。 4、DLL_THREAD_DETACH 線程若要終止,會調用ExitThread,但是此函數不會立即終止線程,而是會利用DLL_THREAD_DETACH來調用當前進程地址空間中的所有DLL鏡像的DllMain. 當每個DLL的DllMain都處理完后,系統才會真正的結束線程。 最后看一下DllMain的序列化調用 舉個例子: 進程中有兩個線程,A與B。進程的地址空間中,映射了一個名為SomeDll.dll的DLL。兩個線程都準備通過CreateThread來創建另兩個線程,C和D。 當線程A調用CreateThread來創建線程C的時候,系統會用DLL_THREAD_ATTACH來調用SomeDll.dll的DllMain,當線程C執行其中代碼的時候,線程B調用CreateThread來創建線程D。 這時,系統同樣會用DLL_THREAD_ATTACH來調用SomeDll.dll的DllMain,這次是讓線程D來執行其中的代碼。 但是此時,系統會對DllMain執行序列化,它會將線程D掛起,直至線程C執行完DllMain中的代碼返回為止。 當C線程執行完DllMain中的代碼并返回時,可以繼續執行C的線程函數。此時,系統會喚醒線程D,讓D執行DllMain中的代碼。當返回后,線程D開始執行線程函數。

總結

以上是生活随笔為你收集整理的DLL入口点函数DllMain的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产日产欧美 | 青青操视频在线播放 | 亚洲第一二区 | 精产国品一区二区三区 | 国产日韩欧美在线观看 | youjizz视频 | 欧洲成人在线视频 | 无码专区久久综合久中文字幕 | 免费中文字幕日韩欧美 | 欧美日韩在线免费观看 | 午夜香蕉视频 | 天天看片天天爽 | 国产高清一区二区三区 | 91色在线播放 | 日本在线视频观看 | 免费看成人aa片无码视频羞羞网 | 免费一二三区 | 欧美中文在线观看 | 亚洲欧美不卡 | 美女草逼视频 | 福利片av| www.com操| 神马午夜一区二区 | 88av网站 | 欧美xxx视频| 探花系列在线观看 | 欧美黑人又粗又大又爽免费 | 精品国产乱子伦 | 日日爱av | 波多在线观看 | 国语对白精彩对话 | 国产剧情av在线 | 久久高清内射无套 | 亚洲精品日本 | 国产精品久久久久久久久借妻 | 欧美成人精品欧美一级 | 精品人妻人伦一区二区有限公司 | 欧美日韩一级黄色片 | 青青草久| av免费观看大全 | 日韩在线视频二区 | 国产极品久久 | 色综合久久88色综合天天免费 | 欧美日韩视频在线播放 | 天堂最新| 日韩成年人视频 | 亚洲性图一区二区 | 国产伦精品一区二区三区在线观看 | 精品国产乱码久久久久久88av | 欧美一级鲁丝片 | 另类专区亚洲 | 欧美日韩人妻精品一区二区三区 | 日本黄色xxxx| 欧美午夜精品一区二区三区电影 | 日本激情在线 | 91精品欧美一区二区三区 | 国产精品久久久国产盗摄 | 精品亚洲乱码一区二区 | 久久99久久99精品蜜柚传媒 | 欧美日韩性| 国产又爽又黄的视频 | 成人免费一区二区 | 青青草久久 | 欧洲成人免费视频 | 午夜视频福利 | 在线观看亚洲av每日更新 | 日韩精品一 | 国产亚洲精品一区二区三区 | 国产不卡视频 | 日本在线不卡一区二区 | 奇米第四色在线 | 国产成人免费片在线观看 | 久久伊人精品视频 | 91麻豆一区二区 | 深夜福利视频导航 | 请用你的手指扰乱我吧 | 91精品福利视频 | 久久av一区二区三区亚洲 | av中文字幕一区二区 | 一级做a爰片 | 精东av在线 | 国产三级视频 | 一区二区在线播放视频 | 欧美a级在线免费观看 | 少妇大叫太粗太大爽一区二区 | 91超碰在线免费观看 | av影库| 成人午夜看片 | 国产午夜精品一区二区三区嫩草 | 狠狠干b| 亚洲v在线 | 白白色视频在线 | 日韩高清在线观看一区 | 亚洲网址在线观看 | 天堂av在线中文 | 奇米网久久| 欧美国产日韩一区二区三区 | 爱的色放在线 | 牛牛影视免费观看 |