我剛剛在 Visual Studio (2022) 解決方案中添加了一個 C Windows DLL 專案。巫師DllMain在里面放了一個。那向我跳了出來;我不記得我的其他 DLL 有DllMain函式。
搜索我的代碼,發現我的 9 個 DLL 都沒有 DllMain 函式。然而,它們都構建和作業正常。我檢查了所有這些專案的專案設定:
- 他們都沒有設定聯結器
/NOENTRY選項。 - 他們都已經
/SUBSYSTEM:WINDOWS設定好了。 - 他們都沒有設定聯結器
/NODEFAULTLIB選項 - 它們當然都是 DLLS。
所以我在剛剛添加的新專案中注釋掉了DllMain。它仍然構建得很好。
我的知識顯然已經過時了。我認為DllMain過去是必需的。我記得幾年前,當我未能添加DllMain.
所以我的問題是:
- 為什么我的 DLL 不需要 DllMain?是否有一些我沒有檢查的構建設定?
- 沒有一個有什么缺點嗎?
(請注意,這些 DLL 都匯出 C 類。它們都不是資源 DLL。所有這些都運行良好 6 年。其中一些使用執行緒本地存盤。其中一些在函式內部具有靜態變數。我一直認為使用像這樣的事情需要一個 DllMain)
uj5u.com熱心網友回復:
運行時庫(“CRT”= C/C 運行時庫)提供了真正的DLL 入口點_DllMainCRTStartup,它會在呼叫DllMain. MSDN 上有檔案描述了這一點:
- DLL 和 Visual C 運行時庫行為
/ENTRY聯結器選項的檔案也很重要:
/ENTRY(入口點符號)
還有一個庫為 your 提供的弱符號DllMain,因此從真正入口點到的呼叫DllMain在鏈接時不會因未決議的外部而失敗。從上面的第一個檔案:
默認情況下,如果您不提供
DllMain函式,Visual Studio 會為您提供一個函式并將其鏈接到其中,以便_DllMainCRTStartup始終可以呼叫。
您提到的諸如執行緒本地存盤之類的東西確實需要使用庫提供的入口點;如果您使用/ENTRYlink.exe 的選項將庫入口點替換為您自己的或/NOENTRY禁用它,它們將中斷。它們都不需要DllMain庫入口點呼叫的任何東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/457297.html
上一篇:從bson轉換的json沒有轉儲
