利用DelayLoad來最佳化應用程式的效能及攔截API

來源:互聯網
上載者:User

在 1998年12月的MSJ出版刊物中, Jeffrey和我寫了關於 在 vc6中使用DelayLoad 功能的專欄.最終結果,是證明了它是多麼cool.但是,不幸的是,還有很多人不瞭解DelayLoad,他們以為這個新特點是 最新版本的WINNT才有的.

在開始的時候,讓我重申一遍:DelayLoad不是最新的作業系統帶的特有功能,它可以在任何win32系統中起作用.我將寫一個簡單例子來說明. DelayLoadProfile, 實現了一個很小功能,很多程式都可以得益於它.

預覽:

通常的,當調用一個dll中的函數時,連接器會將dll和函數加入你的可執行檔.最後,所有引用的函數會放在imports段中. 當載入該程式的時候,win32程式載入器會掃描所有imports段的每個dll.載入,和重新置放imports段的所有函數,將資訊寫入 引入地址表(ImportAddress Table, IAT).簡單說來,IAT就是一個函數指標的表.調用該 引入函數的時候,就到IAT中去找. 那麼,DelayLoad的機理是什麼呢?當你為一個Dll進行"DelayLoad"的時候,連接器不將原來的值放入imports段,相反,它為每個DelayLoad的引入函數的名稱和地址,產生一個小的根區, 備份下來。第一次引用的時候,它調用LoadLibrary載入Dll,然後,它調用GetProcAddress取得該函數的地址。最後,改寫自己在IAT的值,以便以後的程式可以直接調用.

上面的是簡化的步驟.實際上,根區是一小段代碼,它以靜態方式串連到可執行檔中.代碼在delayimp.lib中,必須被 串連程式引用.並且,該代碼要足夠智能,當一個函數第一次被引用的時候,要調用LoadLibrary,以後調用就不用引用了. 和引用Dll相比,DelayLoad不會加太多的時間和空間,這種方式 調用LoadLibrary只會引起稍微一點點的效能損失.每次程式啟動,在針對引入表的函數地址定位的時候,依次對DelayLoad引入的調用GetProcAddress,相對於Win32載入器來說,所損失的效能也可以忽略不記.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.